ラムダはじめました

Java8 出ましたねー。ほんとに出るとは思いませんでした。ダウンロードは以下から。

Java8 は Java5 以来となる大きな文法の変更や機能拡張が追加されていますが、まず目を引くのはラムダでしょう。というわけで JDK と NetBeans8 を入れてちょろっと試してみました。 EA 版とかは触ってなかったので、今回が Java8 デビューです。

対象にしたのは個人的に JavaFX でよく使うコードの中でもなかなかアレな部類に入ると思われる、 TableColumn にプロパティをバインドする setCellValueFactory にしました。こんなモデルクラスがあるとして、

public class FooModel {

    private final StringProperty barProperty = new SimpleStringProperty();

    public StringProperty barProperty() {
        return barProperty;
    }
}

Java7 版だとこんな感じ。だいぶアレですね。単にバインドしたいだけなのにこのコード量。やりたいことが激しく埋もれてる感があります。

        column.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<FooModel, String>, ObservableValue<String>>() {
            @Override
            public ObservableValue<String> call(TableColumn.CellDataFeatures<FooModel, String> param) {
                return param.getValue().barProperty();
            }
        });

Java8 + NetBeans8 では上記のコードに警告が出るので、おもむろに Alt+Enter で Use Lambda Expression を選択すると以下の様な感じになります。すっきり。

        column.setCellValueFactory((TableColumn.CellDataFeatures<FooModel, String> param) -> param.getValue().barProperty());

まだうるさい型が残ってますね。ラムダ式の引数の型は省略できるので、型宣言を消すことでさらに以下のようにできます。原型を留めないほどすっきりしました。やりたいことが明確になってよいですね。

        column.setCellValueFactory(param -> param.getValue().barProperty());

なお、 NetBeans では Refactor -> Inspect and Transform から、 Java のバージョンを選択してプロジェクト単位やファイル単位などでまとめて文法のマイグレーションチェック及び実行ができます。これは便利。