日本Oracleは2013年5月14日に秋葉原UDXにて、Java Day Tokyo 2013を開催しました。
すでにITproでは基調講演のレポートが掲載されています。そこで、本記事では筆者が聴講したセッションに関してレポートしていきます。
Java Day Tokyo 2013では海外からの講師によるJavaのそれぞれのエディションに関するセッション、コミュニティによるセッション、また日本オラクルによるチュートリアルという構成になっています。
そこで、海外講師のセッションとコミュニティによるセッションを1つずつ紹介します。また、通常のセッションの後に行なわれたJava The Nightについてもレポートします。
Java SE 8 による関数プログラミングの構文と並列処理のシンプル化
本セッションでは、Simon Ritter氏(写真1)がProject Lambdaの解説を行ないました。Simon Ritter氏は基調講演でもProject Lambdaの内容について触れていますが、より詳しい解説となっています。
Project Lambdaの導入目的はマルチコア時代に対応したパラレル処理にあります。
Project LambdaではLambda式が取りあげられることが多いのですが、それだけではなくパラレル処理を行なう基盤となるAPIも重要になります。
パラレル処理の対象となるのがイテレータです。for文で表されるJavaのイテレータは一般に外部イテレータと呼ばれます。これに対し、Project Lambdaではパラレル処理を容易に記述するためにコレクション自身がイテレーションを制御する内部イテレータを導入しています。
内部イテレータで行なう処理は無名クラスで記述することが多いのですが、無名クラスで記述するのは煩雑になってしまいがちです。そこで、Lambda式を用いて簡潔に記述していきます。
また、Lambda式はJava SE 7で導入された新しいバイトコードのInvokeDynamicで処理されます。このため、通常の無名クラスよりも高速に実行することができます。InvokeDynamicに関しては、本連載のJavaのためではない機能 - InvokeDynamicをご参照ください。
残念ながら、Simon氏が使用した資料は古いバージョンのAPIを例にしており、現在のAPIとはかなりかけ離れてしまっています。たとえば、資料の中で次のようなコードがあります。
List<Student> students = ...;
double highestScore
= students.filter(s -> s.getGradYear() == 2011)
.map(s -> s.getScore())
.max();
このコードは現在のバージョンでは動作しません。つまり、Listインタフェースもしくは、そのスーパーインタフェースのCollectionインタフェースには、filterメソッドやmapメソッドは定義されていません。
filterメソッドやmapメソッドを定義しているのは、新たに導入されたStreamインタフェースになります。そこで、現在のバージョンで書き直すとしたら、次のようになります。
List<Student> students = ...;
double highestScore
= students.stream()
.filter(s -> s.getGradYear() == 2011)
.mapToDouble(s -> s.getScore())
.max()
.getAsDouble();
これ以外にも複数の書き方ができるのですが、ここでは割愛させていただきます。Project Lambdaについては、また稿を改めて説明する予定です。