Java 8 の lambda を試してみました

Pocket

今年の 9/9 にリリースされると言われている Java 8 で注目している lambda を試してみました。

まずは lambda が使える JDK の入手からです。2013-03-15 現在 2種類のバイナリがありますので注意が必要です。入手先はこちら。今回は b81 を使っています。java -version コマンドの実行結果は以下のとおりです。

lambda の使いどころはいくつかあるのですが、一番の使いどころは配列やコレクションの操作ではないかと思います。以前のエントリでも紹介した以下のようなコードです。

現在はコレクションクラスに filter や map などのメソッドはなく java.util.stream.Stream インタフェースに移っています。そのため配列やコレクションクラスを java.util.stream.Stream に変換してやる必要があります。配列の場合は java.util.Arrays#stream()、コレクションクラスの場合は自身の stream() メソッドを呼び出します。API を見てみると parallelStream() というメソッドもあり簡単に並列処理が出来るようになっています。簡単な検証コードを書いてみてベンチマークをして比較してみました。

実行結果は以下のとおりです。何度か実行してみましたが上記のコードだと並列処理にすると半分程度の処理時間になりました。

上記のコードのメインは以下の部分です。

型推論が働くため型を省略して書いていますが、以下のようにして型を省略せずに書くことも可能です。

lambda 式を指定できるところにはメソッドを指定することも可能です。

最大値を求めることは一般的なので max() メソッドも用意されています。

これまでの Java とは比べ物にならないくらいすっきりと書けるようになりました。関数型言語に慣れていない方にとっては一見良くわからないかもしれませんが、慣れると読みやすいですし、これなしではやってられないくらい強力です。Stream には filter()limit() などよく使いそうなメソッドが他にもありますので是非 API を確認してみてください。

その他よく使いそうなのは forEach() メソッドですね。こちらは java.lang.Iterable に定義されているメソッドなのでコレクションクラスからそのままで呼べます。

こうなってくると System.out.println の重厚さ (?) がアンバランスな感じです。ともあれ Java でも lambda が使えるのは喜ばしいことですね。

Pocket

Both comments and trackbacks are currently closed.