Oracle OpenWorld 2010現地レポート ~JavaOneの新たなステージ

Java SEの新技術とJavaFX最新動向―JavaOne 2010レポート(その2)

この記事を読むのに必要な時間:およそ 3.5 分

Java SE 8の新機能

The Modular Java Platform and Project Jigsaw

Project JigsawはJARに変わる新しいモジュールを提供するためのプロジェクトです。このセッションはJava SE 8のチーフアーキテクトであり,Project JigsawのリーダーでもあるMark Reinhold氏が担当しています。

図3 Mark Reinhold氏

図3 Mark Reinhold氏

モジュールはJARと同じように複数のパッケージからなります。そして,モジュールの定義はmodule-info.javaに記述します。

module-info.javaに記述できる要素には次のようなものがあります。

  • モジュール名とバージョン
  • エントリークラス
  • モジュールが依存するライブラリとそのバージョン

エントリークラスとはmainメソッドがあるクラスのことです。

JARを使っていた時には使用する外部のライブラリはすべてクラスパスで指定する必要がありました。モジュールではmodule-info.javaに使用するモジュールを記述できるので,モジュールのレポジトリの場所だけ指定するだけになりました。このため,クラスパスを指定する必要がなくなっています。

モジュールのレポジトリとして,Mavenのレポジトリも使用できるようです。

Project Lambda: To Multicore and Beyond

もともとProject LambdaはJavaにクロージャを導入することも目的としたプロジェクトでした。Project Lambdaを率いているのはMark Reinhold氏ですが,本セッションではBrian Goetz氏とAlex Buckley氏が担当しています。

図4 Alex Buckley氏

図4 Alex Buckley氏

なぜ今クロージャなのでしょうか。マルチコアの時代だからというのが,その答えです。

多くのコアが存在する場合,パフォーマンスを向上させるには,処理を各コアに分散して実行する必要があります。

JavaではExecutorServiceを使用した非同期処理の枠組みがあります。ExecutorServiceは粒度の大きいタスクを記述するのに適しています。

しかし,分散度を上げるにはタスクの粒度を小さくして,各コアに平均的に処理を振り分ける必要があります。そこで,Java SE 7では粒度の小さいタスクを非同期に実行するために,Fork/Join Frameworkが導入されます。

そして,ループを分散処理しやすくするために,Rubyなどで採用されている内部イテレータが導入されることになっています。

たとえば,卒業年度gradYearと成績scoreを保持したStudentクラスを考えます。この時,2010年に卒業した生徒の最高成績を求めるためには,2010年に卒業した生徒を振り分け(filter)⁠成績を取りだし(map)⁠最大値を求めます(max)⁠

double maxScore = students.filter(new Predicate<Student>() {
    public boolean op(Student s) {
        return s.gradYear == 2010;
    }
}).map(new Extractor<Student, Double>() {
    public Double extract(Student s) {
        return s.score;
    }
}).max();
filterメソッドや,mapメソッドでは無名クラスを作成していますが,重要なのは赤字で示した部分だけです。そこで,このような冗長な記述を簡便に表すためにラムダ式を使用します。

double maxScore = students.filter(#{ s -> s.gradYear == 2010 })
                          .map(#{ s -> s.score })
                          .max();

赤字で示した部分がラムダ式です。#{ }がラムダ式を表し,->の前の部分に引数,後ろに処理を記述します。

このようにProject Lambdaでのラムダ式を使うと,単一メソッドを定義したアブストラクトクラスもしくはインタフェースの実装クラスを簡単に記述できます。なお,このような単一メソッドのことをSingle Abstract Method,略してSAMと呼びます。

つまり,ラムダ式はSAMタイプを簡単に表すための記法ということができるのです。

著者プロフィール

櫻庭祐一(さくらばゆういち)

横河電機に勤務するかたわらJava in the Boxにて新しい技術を追い続けています。JavaOneは今年で11年目。名実共にJavaOneフリークと化しています。