「祝☆Java 8 Launch」イベントへ行ってきました

月曜まで4連休でのんびりしていて書くのが遅くなりましたが、金曜日にJJUGのイベントに行ってきました。会場は青山のオラクルさんでした。

Java8をさっそく使っていきたいと思います。今の仕事はC#なので、ちょっとした個人的な作業や、オフラインリアルタイムどう書くで解答を書くのに使うのがメインになりそうですけれども。

当日取ったメモや感想を書いておきます。

Java SE 8 正式リリース(寺田さん)

Javaの最新情報へのリファレンスが満載の資料です。

Java 8では、クラスファイルのフォーマットが変わり(TODO あとでみる)、Java 7よりもメモリ使用量が減ってパフォーマンス上がりました、というお話や、Compactプロファイルが入りましたよというお話がありました。Compactプロファイルとは、APIのサブセットの定義ですね。これだけは覚えて帰ってください、とおっしゃっていたのは、JavaAPIドキュメントに、そのAPIがどのプロファイルで利用可能かが記述されるようになったことでした。

JDK 8の互換性・非互換性の情報ガイド(Compatibility Guide for JDK 8)も大事そうです。

5月には、Java Day TokyoをはじめとするたくさんのJavaのイベントが東京で開催されるとのことです。

徹底解説!Project Lambdaのすべて リターンズ

今回のイベントに参加した主目的はこちらのセッションだったので、聴けて満足しました。とても分かりやすかったです。スライドごと、あるいはトピックごとに、すっと頭に入ってくるフレーズを使われていたのが印象的でした。

  • 現代的なアーキテクチャでは少しでも並列処理するのが大事
  • Fork / Join Framework は小さな粒度で並列処理を書けるが、やや難しい
    • より良くするのがProject Lambda
  • メソッドを簡単に追加できるようにデフォルト実装を提供
  • 実装するべきメソッドが1つだけあるインタフェース=関数型インタフェース
    • ただしObjectクラスにあるpublicメソッドは数えない。
  • (仮引数) -> {メソッド本体}
    • ラムダ式の引数として_(アンダーバー)を使うとコンパイルエラーになる(他の場所で_を使うと警告になる)
  • ラムダ式は匿名クラスのシンタックスシュガーではない
    1. ラムダは外のスコープを引き継ぐ。thisを書くと、エンクロージングクラスのthisになる
    2. アウタークラスへの参照は、必要に応じて保持(常に、ではない)。外のクラスのインスタンス参照が不要なら持たない
    3. ローカル変数の参照は、同じ。finalのみ

2つ目については、詳しい話がちょっと理解できてないので、TODO 確認

  • ラムダ式の"引数を受け流す書き方"は、メソッド・コンストラクタ参照でも書ける
  • 「実質的にfinal」とは?
    • コンパイラがfinal性を推論するようになった
    • レキシカルスコープっぽく見えるように導入された
    • 注意点としては、事実上もfinalでなければならないこと
  • ターゲット型推論
    • 途中でよくわからなくなったので TODO 復習。JEP 101
  • 交差型キャスト
    • &で区切って、キャストで書ける
    • 2つのインタフェースを継承したインタフェースにラムダ式を適用できる
    • 実際にはあまり使わなさそう
  • デフォルト実装
    • interfaceのメソッドにdefault修飾子をつける
    • しかし、実装の多重継承が問題になる(シグネチャの多重継承はこれまでもあったが)
    • Class always win(クラス定義の実装を常に優先)
    • インタフェース名.super.メソッド名でインタフェース側を呼び出せる。
    • Objectクラスのpublicメソッドは、デフォルト実装を提供できない
  • static インタフェースメソッド
    • 継承されない。
    • main in interfaceが可能になってしまった。w
  • ストリームを既存のCollectionやBufferedReaderから作る
  • j.u.stream
    • StreamでCharacterを指定すれば、charのStreamが作れる
      • range, rangeCloseなど
      • mapToIntなどで変換できる
    • シーケンシャルstream(直列処理)とパラレルstream(並列処理)
      • hoge.stream().paralell.中間操作...と書くだけで並列になる
      • シーケンシャルとパラレルは相互に変換できる
  • 中間操作(filter, map:写像・変換, sortedなど)
  • 終端操作(forEach, countなど)これが呼ばれると、中間操作が実行される。
    • ex. collect(Collector)
    • c.f. Objects::nonNullでnull除外


Brand new Date and Time API(蓮沼さん)

Date Time APIの前に30分以上かけて時間の基礎をみっちり解説してくださいました。

和暦を扱えるChrono(ChronoLocalDate)に関して気になることがあるので TODO そのうち試す。試しました。→ JavaのDate and Time APIでサマータイムを確認する - 虎塚

null書いたら負け!Java8コーディング作法(きしださん)

手書き資料とNetBeans上のプログラムをいったりきたりしながらの講演でした。会場で無線LANが提供されていたので、きしださんのブログにあるJava 8のコードを手元に持ってきて、動かしながら聞いていました。

Optionalについて勉強になりました。使ってみます。

  • Optionalとは
    • 値を持つか持たないかを管理してくれる
  • Optional.ofNullable(hoge)
    • isPresentメソッドとラムダを組み合わせて使うと、値がある時だけ呼び出す処理が書ける
  • nullを書いて許される場所: ローカル変数○、引数△、フィールド×、戻り値×
    • nullを返すメソッドを書いちゃダメ
  • Mapを活用しよう
  • べんり
    • Optional.orElseGet
    • Optional.orElseThrow
    • computeIfAbsent
      • 値があればその値、なければ計算してmapを返す
  • メソッド参照とラムダの使い分け
    • メソッド参照は引数を隠すので可読性が下がる。使いすぎると読みづらい。

JavaFX - GUI by Illusion(櫻庭さん)

いつもどおり、音楽ではじまる楽しいプレゼン(JavaFX製)でした。タイトル画面は、昔の映画作品のオマージュだそうです。以前から気になっていたのですが、背景に使われている写真は、資料で使うことを意識して撮影されているのでしょうか? かっこいいですよね。

JavaFXで簡単なサンプルを作る様子をライブコーディングで見せていただきました。WebView、WebEngine#loadの使い方の説明、アニメーションのデモをいくつか、3D、テクスチャマッピングのデモも。

JavaFXにはブラウザやリッチテキストエディタが内蔵されたそうで、そのデモもありました。一番気になったのはこのあたりです。標準的なCodecであれば扱えるそうです。Media, MediaPlayer, MediaViewなどのクラスを使うそうです。(TODO 見る。http://docs.oracle.com/javafx/2/media/overview.htm

櫻庭さんがITProで連載されている「詳解 Java SE 8」は、次回lambdaの話題だそうです。

from old Java to modern Java - reloaded(谷本さん)

若手プログラマがLambdaで書いたソースコードをレビューする時に、「読めない」とか「書き直して」とか言うような老害にならないためにも、勉強するべしというお話でした。Java 8の新しい記述法も含め、何をどこまで使うかプロジェクトで方針を決めようという結論でした。

ファイル処理のソースコードが例として挙げられていました。最近、遅まきながらnew File APIの便利さに感動したところだったので(感動したのはFileVisitorに対してでしたが)、理解しやすかったです。putIfAbsentやgetOrDefaultの説明もありました。Collectors.joining(",")が便利そうでした。

streamを使った長いコードに対しては、処理の中間結果を中間オブジェクトに出すアプローチや、forとstreamの組み合わせのアプローチなどがありうるのでは、とのことでした。ただし、streamを中間オブジェクトに出すのは危険だそうです(戻り値がCollectionじゃなくてIteratorだから?)。

谷本さんのいらっしゃる会社といえば、Javaのトラブルシューターで有名ですが、「(新しいバージョンが出た時は)Java Mission ControlとJava VisualVM プロファイラを同時に立ち上げてお互いのプロセスを監視してみる」というこぼれ話がありました。なるほどと思いましたw

Raspberry Pi on Java ショートアップデート(太田さん)

エベンさんのお話とか、Raspberry Piは通販で買った方が安いよ!というお話とか。女子2名によるRAPIO組み立てショーの宣伝もありました。RAPIOって、初めて知りました。かわいいですね。

発表内容と関係ないですが、太田さんはTwitterもブログも長年英語で書いていらっしゃるそうで、すごいなぁと思いました。

懇親会&二次会

懇親会は外国ビールがいろいろ用意されていておいしかったです。ごちそうさまでした。

きしださんから「NetBeansを使おう」と言われてしまいましたが、EclipseもLuna 4.4(Build id: N20140320-2000)あたりならJava 8が使えますので(きしださんが書かれたZipとPairのコードも動きましたよ)、しばらくはこれでいこうと思います :-P

会場提供のオラクルさん、JJUGスタッフの皆さん、発表してくださった方、懇親会でお話ししてくださった方、どうもありがとうございました。