2016-01-07 12 views
6

MongoIterable.forEachは、Java 8 Consumerとよく似ているBlockが必要です。彼らは問題を引き起こすほど類似している は、例えば、以下はコンパイルされません:MongoIterable.forEach対Iterable.forEach

MongoIterable<Document> result = collection.find(...); 
result.forEach(System.out::println); 

コンパイラはIterable.forEach(Consumer)MongoIterable.forEach(Block)の間で決めることができないため。これを修正することは、明示的にパラメータを入力するなどの回避策を必要とします。

Block<Document> printer = System.out::println; 
result.forEach(printer); 

または代わりに、プレーンなStreamとしてMongoIterableの治療:MongoIterable.forEach(Consumer<? super TResult> consumer)

StreamSupport.stream(result.spliterator(), false).forEach(System.out::println); 

はなぜMongoIterable.forEachConsumerインタフェース、のようなものを使用して定義されていませんか?さらに良い - なぜforEachMongoIterableにあるのですか?

答えて

3

Javaドライバは引き続きJava 6をターゲットとしてサポートしています。だから、3.0ドライバJava 8とラムダをフレンドリにしようとしたが、実際のJava 8インターフェイスを使用することはできませんでした。

+0

これは、消費者が使用されない理由を説明しますが、最初にMongoIterable.forEachを持っている理由についてはっきりしていません。それはJava 8以外のユーザーにJava 8のような経験を与えることですか? –

+0

よりフレンドリーにすることを目的としていました。陪審員は、その目標が達成されたかどうかはまだ分かりません。 – evanchooly

+1

'forEachMongo'のような名前のクラスを避けるために、別の名前をつけてもいいでしょう(あるいはもっとクールな名前ですか?)。幸いなことに、シンプルな型キャストはこの問題を解決します。 –

関連する問題