数日前に、Oracleの Maurizio Cimadamore氏は、最初のラムダ式の実装 を OpenJDK のMercurialリポジトリにアップした。これで新しいシンタクスを初めて見ることができるが、コミュニティで議論を巻き起こしている。
現在のプロトタイプは、以下のフィーチャをサポートする:
- 関数型シンタックス
- 関数型サブタイピング
- タイプ1(状態把握しない)とタイプ2(最終状態の把握)のラムダ式を完全にサポート
- ラムダ式におけるスローされた型/返り値の型の推論
- v0.1.5ドラフトで定義されたルールを使ってラムダ変換
- 'this' への参照(明示的および暗黙的の両方で)をサポート
- method handleを使う翻訳
ここに示すコード片は、整数値をとり1を足して戻す、簡単なラムダ式の宣言である:
int i1 = #()(3).(); assertTrue(3 == i1); Integer i2 = #()(3).(); assertTrue(3 == i2); int i3 = #(int x)( x + 1 ).(3); assertTrue(4 == i3); int i4 = #(Number x)(x.intValue()).(new Float(3.0f)); assertTrue(3 == i4); Object o = #()(3); assertTrue(o != null);
プロトタイプは、 strawman 提案に記述されているシンタックスをサポートし、シンタクスがどのようなものか、もっと理解したければ 回帰 テストを見るとよい。
通常Javaは、シンボルの代わりに長い言葉を使うので、このシンタックスに抵抗を感じ、言語のルック&フィールに従っていないと感じる人も多い。
AjaxianのDion Almaer氏は、このシンタックスは、JavaよりPerlに近いと感じている:
Integer i2 = #()(3).(); //i2 = 3
int i4 = #(Number x)(x.intValue()).(new Float(3.0f)); //i4 = 3 エー、Java?それともPerl!!
同じように、 Ruby on Railsの作成者である David Heinemeier Hansson氏は、 提案されているシンタックスにはノイズがたくさんあると、言っている:
Java 7の新しいクロージャのシンタックス: int i4 = #(Number x)(x.intValue()).(new Float(3.0f)); -- 新しいコードライン-ノイズのチャンピオンを手にした、と思う。
フォーラムとディスカッション グループは、ラムダ シンタックスを批判するJavaの開発者からメッセージを受け取った:
“ワオー、何て醜い、ソースコードを難読化したい人たちが大喜びだね。”
“うわ! 「コンパイラ-作成者の仕事を楽にする」目的の匂いがプンプンする。もっといいソリューションがあるに違いない、この問題の限られたガイドラインの範囲でさえ。Objective-Cのブロックだって、これよりマシだ(少なくともシンタックスにおいて)。”
“後方互換性への最優先の要求のために、Javaにおいて、真にエレガントなことをするのが不可能になってしまう、しかし、これは、今日、単につまらないこと、と考えることができる。”
“(初めてシンタックスを見たときに)ショックだったのは、1行目のint i1 = #()(3).(); を見たことだ。一目、完全に暗号化しているように見えた。”
“確かに改善の余地がある。もしadder.(1, 2)なくadder(1, 2)ならもっと読見やすいと思う。間のドットは、Javaぽっくない。”
“このシンタックスじゃ、美人コンテストに勝てないね。”
“Javaは、実際のところ、非常に「シンボリー」ではない。なぜそのような変な選択をしたのか、わかりますか?私は、反対なのではありません(私は、一般に長ったらしい言葉よりシンボルのが好きです。たとえ学ぶのに少々時間がかかってもね)、しかしこれは、Javaのスペックの他の部分とは、似ていません。”
一方、 Nick Wiedenbrueck氏は、この提案は、長い期間にわたって入手できたので、 Javaコミュニティは、何が来るのかわかっているはずだった、と感じている:
いくつかの提案があり、 straw-man 提案、スペックのドラフトそして先の Devoxxで発表がありました。しかしコミュニティで議論があまりありませんでした。その理由はなんでしょうか? いくつか仮説があります。Project Lambdaがあまりに静かすぎた?ブログの投稿や例がたくさんなかった。あるいは、コミュニティで破綻するものがあったのでしょうか?コミュニティ リーダは、いましたよね?彼らは、Scalaを学習するのに忙しすぎた?あるいは、静的な型づけされた言語では、クロージャは、本質的に複雑であるだけですか?
最後に、プロトタイプの作成者の一人である Brian Goetz氏は、 このシンタックスは、製品化される前に、将来改善されるだろう、とコメントしている:
これは、早期の実際に可能であるこ とを示す スナップショット版だ、ということをわかってください。ここに示されたシンタックスは、全く暫定的なもので、 Project Lambdaが進に連れて、改修されていきます。当面の間 、シンタックスよりずっと重要な課題があります。それらが解決するまで我々は、そちらに専念します。シンタックスは、後回しにできます。
InfoQは、Java言語のラムダ式に関する掘り下げたarticleを用意した(今のシンタックスがなぜadder(1, 2)
でなくて。adder.(1, 2)
なのかを含んで)。