BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース C#、ScalaのシンタックスをベースにしたJavaのラムダ式

C#、ScalaのシンタックスをベースにしたJavaのラムダ式

ブックマーク

原文(投稿日:2011/09/09)へのリンク

Java 8において最も期待されている新機能の一つがラムダ式だ。ラムダ式とは、データのように引数や変数に渡すことのできる匿名関数のことだ。ラムダ式のシンタックスは確定していなかったが、人々が最も精通しているシンタックスは何なのか、調査が行われた

lambda-devメーリングリストに最近投稿されたメールによると、Javaのラムダ式はC#ベースのシンタックスになる予定であるとのことだ。C#ベースのシンタックスは既に広く知られ、利用されている(C#では、バージョン1.0でデリゲートが、バージョン2.0で匿名メソッドが、バージョン3.0でラムダ式がサポートされた)。

BGGAのような他の候補もあったが、調査では他に比べて圧倒的に優れているものはないという結果が得られた。加えて、C#やScalaで使われている既存のシンタックスは、より多くのプログラマに慣れ親しまれている(C#スタイルとScalaスタイルの匿名関数の主な違いは、引数の型の指定方法である。C#では“int foo”と指定するが、Scalaでは“foo: int”のように指定する。つまり両者に大きな差はない。Java 8では、通常のメソッドの引数の型を指定するやり方にあわせて、C#が採用している“int foo”というスタイルを採用する予定だ)。

大規模な調査を行ったにも関わらず、どの候補がよりよいのかは、はっきりとしませんでした(それぞれのシンタックスには、よい部分とよいとは言いきれない部分があり、他に比べてはっきりとよいと言えるものはありませんでした)。それで、我々は最もJavaに似た二つの言語(C#とScala)で既に使われているシンタックスを採用するのが、新しいシンタックスを作り出すよりもベターであると思ったのです。

式とブロックの両方が使えるようになる予定だ。式はブレースなしで表現され、評価されると値を返すというものだ。ブロックはブレースで囲んで表現され、returnキーワードが指定されない限り値を返さない。例えば


x => x + 1

(x) => x + 1

(int x) => x + 1

(int x, int y) => x + y

(x, y) => x + y

(x, y) => { System.out.printf("%d + %d = %d%n", x, y, x+y); }

() => { System.out.println("I am a Runnable"); }

ラムダ式の主要な利点の一つは、引数の型の推測である。いくつかのケースでは、コンパイラは正しい型を推測することができない(特にオーバーロードされた演算子のケースである。“(x,y) => x+y”は、xylongなのかdoubleなのか、あるいはObjectなのかということを知らなければ、全くコンパイルすることができない)。ほとんどのケースでは、型推測エンジンは正しいコードを生成するだろう。しかし、もし必要であれば、開発者が型情報を常に明示的に指定することも可能だ。

新しいシンタックスをサポートしたコンパイラは、実験目的のため、近いうちに利用できるようになるだろう。

この記事に星をつける

おすすめ度
スタイル

BT