2012」では、全国からJava開発者が集まり、Java周辺の最新動向や技術的なTips、活用事例などの話題に盛り上がった。SE/EE/MEそれぞれの現状と今後の動向に焦点を当てて紹介した。Jigsaw」、そして新しいJavaScriptエンジンである「Nashorn」に関するセッションの様子をレポートする。8で予定されている大規模な機能拡張の1つに「ラムダ式(クロージャ)」の導入がある。7の開発当初から計画が持ち上がっていたが、長い期間にわたって議論がまとまらず、その内容も二転三転した経緯がある。335」でも「クロージャ」という記述がある。関数型がないことや、レキシカルスコープの扱いが制限されていること(可変の変数にアクセスできない)など、他の言語で一般的に「クロージャ」と呼ばれている機能とは少々異なる。従って、本稿では便宜上「ラムダ式」もしくは「クロージャ」と記載するが、上記の点に留意していただきたい。Lambda」を紹介した。Lambdaの主な目的は、使いやすい並列処理ライブラリを提供すること、そして並列処理可能なコードをもっと簡易に記述できるようにすることだという。Utilities」によって並行プログラミングのためのライブラリが充実した。166y)によって小さなタスクの並行処理が少ないオーバーヘッドで実現できるようになった。kwoutしかし、現在のJavaでタスクを作成しようとすると、無名クラスを使った煩雑なコードになりやすい。Lambdaというわけだ。Lambdaでは次の項目に関する仕様策定を進めている。ラムダ式メソッド参照デフォルトメソッド以下、1つ1つ解説しよう。Interface」と呼ばれる、メソッドを1つだけ持てるインターフェイスである。Interfaceの例としては、次のようなものが挙げられている。Interfaceのインスタンスが、ラムダ式を使うことで簡単に生成できるようになる。上の「Comparator」のインスタンスを生成したい場合、従来どおり無名クラスを使うと、次のようになる。リスト1これが、ラムダ式を使えば次のように記述できる。「->」の左側が「compare()」に渡すパラメータ、右側が実行されるコードである。リスト2なお、パラメータの型は明らかな場合には省略することもできるという。この例の場合、Compareの型パラメータが「String」であることから、パラメータの型も「String」であることが分かるため、省略して次のようにも書ける。「メソッド参照」は、実行コード内でメソッドを呼び出す場合に、その参照をよりシンプルに記述できるようにするためのものである。読み込み可能なファイルのみをフィルタリングする次のようなコードを考えてみる。リスト4これをラムダ式を使って書くと次のようになる。リスト5メソッド参照を使うと、次のようにさらに短く記述できるようになる。リスト6ラムダ式を活用して、最初の目的である並列処理が可能なライブラリを実現するには、どうすればよいのだろうか。並列処理の対象としては、ループ処理が最も重視されている。ループ処理を並列化するには、「内部イテレータ」を導入する方法がある。例として挙げられたのは次のようなコードだ。リスト7これは、2011年に卒業した学生の成績から最大値を探すコードである。「filter()」メソッドは、コレクションの各要素から「Predicate」の「op()」メソッドの戻り値が「true」であるものだけを「Iterable」オブジェクトとして返す。「map()」メソッドは、同様に「Mapper」の「map()」メソッドの戻り値を要素とした「Iterable」オブジェクトを返す。ラムダ式を使うと、このコードが次のようになり、非常にシンプルに記述できることが分かる。リスト8【3】デフォルトメソッドでは、「filter()」「map()」などのメソッドはどのように実装すればいいのだろうか。これらのメソッドの定義をコレクションのインターフェイスに追加してしまうと、そのインターフェイスを実装したクラスすべてを修正しなければならず、互換性を損ねてしまう。そこで、インターフェイスのメソッドのデフォルトの実装を追加できる仕組みが導入される。これが「デフォルトメソッド」だ。具体的には、次のようにメソッド定義に「default」というキーワードを付け、その後ろにデフォルトとして使用する実装を記述する。「sort()」メソッドが実装されなかった場合には、自動的にデフォルトの実装が使われるわけだ。リスト9デフォルトメソッドの導入は、メソッドの実装が衝突してしまう危険が生じる。次のように「m()」というデフォルトメソッドを持ったインターフェイスAとBがあるとする。リスト10AとBを実装するクラスCを作った場合、どちらのm()の実装が適用されるのかがはっきりしない。この場合、次のように「m()」を実装することで、使用する実装(この例ではAの実装)を明示的に指定するのだという。リスト11デフォルトメソッドの適用例としては、Iterableインターフェイスへの次のようなメソッドの追加が挙げられた。並列処理への対応が、ラムダ式導入の本質なお、【2】の内部イテレータの処理を並列化するにはどうしたらいいだろうか。それには、次のように「parallel()」メソッドの処理を追加するだけでいいそうだ。リスト12並列処理については、その他にも「Iterable」インターフェイスの並列処理版である「Spliterable」といったインターフェイスも提案されている。このように、Javaへのラムダ式(クロージャ)の導入は、単に新しい文法が追加されるということではなく、並列処理への対応が、その本質だ。8への心構えを始めていく必要があるだろう。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。