来年リリース予定のJava 8が12ヶ月を切った。Brian Goetz氏は、Java Collections API への改善を扱ったState of the Lambdaのアップデートを公開した。Java 8の最も期待されているフィーチャの1つである、ラムダ式の導入により、Java Collections APIにおけるこの重要なサポートは、このライブラリが幅広く使用されることを確実するために重要である。もしあなたがラムダのシンタックスを良く知らなければ、以前のState of the Lambda記事や言語シンタックスについて詳しく述べたInfoQの以前の記事を読むと良い。
全Collectionsライブラリを置き換えることは、実際的でないので、ラムダのサポートによってそれを拡張する必要がある。予定では、今日使われている外部的実装( IteratorやEnumerationのような)を使うのではなく、内部イテレーション(すなわちコレクションでforEach()
にラムダを渡す)を使うのである。新インターフェースのStream
が追加され、(潜在的に遅延な)値のシーケンスをサポートする。同時にコレクションを(遅延)ストリームに変換するstream()
のようなメソッドも追加される。
ストリームは一般的なコレクションと以下の点で異なる。ストレージを持たない(無限であり得るし、オンデマンドで読むことができる)、本質的に関数的に処理され、遅延的に生成できる。例えば、素数を表すストリームを作成できる。これは、各新要素が次の素数を相次いで生成する。
Stream interfaceはまた、幾つもの関数処理メソッド、例えば、forEach()
, filter()
, fold()
, anyMatch()
map()
,flatMap()
を提供する。このインターフェースは、使用されるコレクションの特有の型に、適切な方法で構築したり、あるいは、他のクラスが関与できるような汎用的な方法で実装することもできる。遅延性とは、ストリームを消費し、フィルターし、findFirst()のような操作をマップできる、ということを意味する。これは、チェーンして、最初に一致するものが見つかったら直ぐに、終了できる。コレクション全体をイテレートする必要がない。コレクションの状態における、そのような例の1つが以下である。
Optional<Shape> firstBlue = shapes.stream() .filter(s -> s.getColor() == BLUE) .findFirst();
java.util.function
packageには、Predicate
, Function
, UnaryOperator
and BinaryOperator
のような関数インターフェースのスターターセットが含まれ、開発者は自身の関数インターフェース型も追加できる、というアイデアもある。関数パッケージには、新しい型、Optional
もあり、これは潜在的にnull値を表すためのメカニズムを提供する。このラッパークラスは、ある方の単一のインスタンスを持つか、値null
を表すがオブジェクトセーフな方法である。先月長いメールスレッド議論されたように、誰もがこの設計に必ずしも満足しているわけではない。 Scala やHaskellのような他の言語は、モナドとして Optionalのもっと関数的な観点を提供している。しかしBrian Goetz 氏が言ったように、「ごめん。もし人々が我々はJavaを Scala や Haskellに変えなかった、と怒っているなら、我々はそうしない、と言う。」また次のようにも 言っている。「声の大きな少数派がコミュニティの声であるようなふりをするのは、良くあることだ。」幾つかの強い型づけされた、そして/あるいは、ニッチな言語は、関数的設計ではずっと先を行っているが、大多数のJava開発者は、関数型プログラミングに慣れてはいないでしょうし、最大多数の開発者にとっての最大利益を提供することがOracleの第一目標である。
Java言語にストリームと関数を追加することによって、作業を並列化できる。データの論理的ストリームが与えられれば、その結果を様々なレベルの塊に分割でき、その後にfork/join フレームワークのような並行処理アーキテクチャに渡すことができる。現在の提案では、Spliterator
を導入して、大きなデータの塊を並行処理に合ったより小さな塊の集まりに分割する。データ構造をより小さな単位に分割する一般的な方法を公開することで、データ構造は、データを効率良く分割でき、同時に fork/joinフレームワークは、一般的なデータセットを操作できるようになる。
最後に、ラムダの愛は Java EEのEL (式言語)に流れ込んでいるようである。以前、データ処理を行うのにLINQのような構文があったが、まもなく登場するラムダのサポートにより、ELはラムダシンタックスを採用することで、より広範にJava言語との互換性を保てる、という結論になったこれによって、ELプロジェクトの設計が今年末に延び、最終リリースが2013年の第一四半期になった。