Javaにはまだクロージャはありません。ラムダ式はJava8で提供されます。ただし、翻訳しようとしているものの唯一の問題は、状態があることです。これは、ランバ式がサポートするものではないと思います。単一のメソッドインターフェイスを簡単に実装できるように、これは実際には単なる省略形であることに注意してください。ただし、これをシミュレートすることはできます。
final AtomicInteger n = new AtomicInteger(0);
IncrementByN v = (int x) -> x + n.incrementAndGet();
System.out.println(v.increment(5));
System.out.println(v.increment(6));
ただし、このコードはテストしていません。これは、Java8で機能する可能性のあるものの例としてのみ使用されています。
コレクションAPIについて考えてみてください。彼らがこのインターフェースを持っているとしましょう:
public interface CollectionMapper<S,T> {
public T map(S source);
}
そして、java.util.Collectionのメソッド:
public interface Collection<K> {
public <T> Collection<T> map(CollectionMapper<K,T> mapper);
}
さて、クロージャなしでそれを見てみましょう:
Collection<Long> mapped = coll.map(new CollectionMapper<Foo,Long>() {
public Long map(Foo foo) {
return foo.getLong();
}
}
なぜこれを書いてみませんか:
Collection<Long> mapped = ...;
for (Foo foo : coll) {
mapped.add(foo.getLong());
}
もっと簡潔でしょ?
次にラムダを導入します。
Collection<Long> mapped = coll.map( (Foo foo) -> foo.getLong() );
構文がどれほど優れているか見てみましょう。また、チェーン化することもできます(値をフィルターで除外するかどうかを決定するためにブール値を返す、フィルタリングを実行するためのインターフェイスがあると想定します)。
Collection<Long> mappedAndFiltered =
coll.map( (Foo foo) -> foo.getLong() )
.filter( (Long val) -> val.longValue() < 1000L );