通常、Groovyのinject
メソッドはJava 8のreduce
と同等であると思いますが、私は珍しい状況に遭ったようです。私は本のコレクションを持っているとキーがIDSで、値がブックされているマップに変換したい場合は同様のJava 8を使用しないGroovyのインジェクト
私はPOJO(またはPOGO)を持っていると言うが、Book
class Book {
int id
String name
}
と呼ばれますその後、Groovyでそれを書くのは簡単です:
Map bookMap = books.inject([:]) { map, b ->
map[b.id] = b
map
}
すなわち、各書籍のために、本書のIDでマップに追加し、マップを返します。
Java 8では、同じ操作では全く異なるアプローチがとられます。この次のいずれかの
Map<Integer, Book> bookMap = books.stream()
.collect(Collectors.toMap(Book::getId, b -> b));
または、同等に、
bookMap = books.stream()
.collect(Collectors.toMap(Book::getId, Function.identity()));
違いはスタイルの問題であること。
ただし、Java 8にreduce
操作があり、Groovyのinject
に似ていると私は思っています。
T reduce(T identity, BinaryOperator<T> accumulator)
BinaryOperator
reduce
の署名があるので、私はちょうど、私がGroovyで何をしたか模倣することはできません。
BiFunction
だった場合、ラムダの最初の引数は
HashMap<Integer, Book>
に、2番目の引数は
Book
にすることができましたが、
BinaryOperator
で行うことはできません。私は
reduce
の3つの引数のバージョンがあることを知っていますが、それはどちらかを助けるようには思われません。
明らかなものがありませんか?それはちょうどinject
より一般的ですそれはreduce
ですか?私はすでにJavaで問題を解決する慣用的な方法を持っているので、これは重要ではありませんが、私はここでの違いに驚いています。
これは私が必要としていたものです。私はまだreduceメソッドが(別のアキュムレータとコンバイナを使って)そのように設計されているのに対して、Groovyでの注入(これはいつものように)ははるかに簡単なのですが、やはり難しいです。 また、私は、 "HPと卑劣な猫"の皮肉な猫はおそらく、モルフォナガルであると思います。 – kousen
コンバイナは 'parallel()'ストリームの場合にのみ使用されます。コンビネータに 'RuntimeException(" boom ")をスローすると、通常のストリームに対しては呼び出されません。 .. –