昨日夜にあったJavaOne報告会福岡できしださんがJavaのLambdaをやたら詳しく説明してくれて頭がぐるぐるになってきた。
で、そういえば最近のJava SE 8のビルドで試してなかったなと言うのと、NetBeansの最新版がようやくSE 8に対応したと聞いていたので、最新のを落として試してみた。
とりあえず、やってみるのはSE 8から拡張されるCollection Frameworkのlambda式対応拡張表現である。
[java]
package lambdatest;
import java.util.Arrays;
import java.util.List;
/**
*
* @author hirofumi
*/
public class LambdaTest {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// Target
List<string> list = Arrays.asList(new String[]{"a", "b", "c", "d", "e"});
// Normal
System.out.println("Normal expression:");
for (String x : list) {
System.out.println(x);
}
//lambda
System.out.println("Lambda expression:");
list.forEach(x -> System.out.println(x));
//lambda with parallel stream
System.out.println("Lambda expression with parallel stream:");
list.parallelStream().forEachOrdered(x -> System.out.println(x));
// parallelStream().forEach()すると順序がバラバラになるので
// 特にJava EEではforEachOrdered()を使いましょう。約束だよ!!
}
}
[/java]
NetBeansの補完機能で、上記の「Normal」の部分に対して提案が出ていて、ポチるとLambda式に変換してくれるようになりました。んーいいんかな・・・
これが
こうなるのだ。下と大体一緒なので、賢いと言えるだろう。
実行結果はこれ。
[java]
run:
Normal expression:
a
b
c
d
e
Lambda expression:
a
b
c
d
e
Lambda expression with parallel stream:
a
b
c
d
e
ビルド成功(合計時間: 0秒)
[/java]
さて、どうしても視点がEEになるのだが、これ実際に使えるかなぁ、というのが本音である。こんな感じで置換される機能がIDE側に付いちゃうと、使わざるを得ないのだろうけど、JavaのLambda式だけ見ると、単なるSyntax Sugarの否定のようにも見えて微妙なんだよなぁと思う次第である。C#のようにdelegate式が簡易に使えるわけでも無し。
Java SE、特にGUI系だと、C#やObjective-Cのように、method delegationが可能な言語だと書きやすいし、間違い無くよく使うのであるが、Java EEで使う所が果たしてあるのだろうか・・・と考えると、何となく微妙である。そもそも、匿名クラス表現をあんまり使わないというのもあるのだ。綺麗に書いた方がメンテナンス性は上だしね。「こんな複雑なコード書けた俺格好いい」系の自己中表現なんかは、エンタープライズ系開発では最も忌諱されるものなのである。そもそも。
だから、パッと思いつくのって、今回の例のように、Collection Frameworkの処理位なのかなと思ったりする次第である。しかも、parallelStream()使ったら、順序がバラバラになっちゃうので、早いけど困る事が多いから、多分使わない 順序守れます※。他にも何かあるのかな。EE 8が出てJPA辺りが完全対応したら、また面白い世界が待っているのだろう。どうなるかな。
※桜庭さんに「順序守れるよ!」って教えてもらったので上のプログラムと一緒に修正しました。(2013/11/16 20:15)
エンタープライズ系開発って何か変? いや、それはいま流行の方向と文化が違うと思って貰った方が良いかなと。これはこれで楽しいよ!
ところで、lambda式の中でアロー演算子(->)が使われてるのは微妙なのである。だってC++とかPHPのmethod callと一緒じゃんと。これはC++11に合わせたんだろうけど、そこだけは良いかなと思う。思うけど、Javaのlambda表現の本家ぽいC++がそもそもそういう表現を取り入れているというのもどうかなぁと思う次第である。C++14で変わる事は無さそうだし、暫くこんな感じなのでしょう。まあいいか。