Java 7がリリースされたようですね。ラムダ式が先送りになったので、個人的に興味を持つようなエンハンス内容は今回は無いですね…むしろJava FX 2.0のリリースが気になる。
以下、すべて個人的な意見というか見解です。Javaはオブジェクト指向原理主義だったため、本来はオブジェクト指向でない方法が適している場面でも、他の流儀を取り入れずオブジェクト指向的に実現してきたと思います。具体例は、コレクションの中から特定条件を満たすような要素を検索する、コレクションを特定の条件に従ってソートする、GUIやタイマーなどによって発生するイベントが発生した直後に実行したい処理をGUIやタイマーに指示する、といった場面です。これらはみな、「処理を変数として扱う」ことができれば何も苦労はありません。こうした場面では、いわゆる関数ポインタ(C)、述語オブジェクト(C++)、匿名メソッド(Lisp, JavaScript, C#)、クロージャ(色々な言語)といった言語機能を使うとスッキリ実現できるのですが、Javaではこのような場面でComparatorインタフェースやKeyListenerインタフェースを実装したクラスのオブジェクトを用意する必要があります。このあたりが非常に面倒だと感じているわけなのですが、ラムダ式が正式導入され、各種コレクションやGUIクラスにラムダ式をパラメータとして受けるオーバーロードなどが実装されれば、非常に世界は明るくなります。できれば複数行を記載できるクロージャになるともっと良いと思いますが。
具体的に、もしArrayListにラムダ式を引数に取るindexOfのオーバーロードやsortメソッドなどが追加された場合、おそらく次のようなコードが書けると思っています。
ArrayList<int> numbers = getSomeNumbers();
// 最初の奇数を検索
numbers.indexOf( #{int n -> ((n%2) != 0)} );
// 昇順にソート。ただし4だけは特別扱いして常に最初に来るようにする
numbers.sort( #{int x, int y ->
if(x == 4) {
return -1;
} else if(y == 4) {
return 1;
}
return (x - y);
});
うーん、ラムダ式はとりあえず見送りという話ですが、クロージャはどうなんだろう(クロージャが導入される場合、ラムダ式はクロージャの一機能・一形態という話になると思います)?ま、いずれにせよJava 8以降ですから、当分先ということで忘れるとします 🙂