2016-01-07 4 views
6

MongoIterable.forEach richiede un Block che è molto simile a Java 8 Consumer. Sono abbastanza simili a causare problemi, per esempio, il seguente non compilare:MongoIterable.forEach vs. Iterable.forEach

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

perché il compilatore non può decidere tra Iterable.forEach(Consumer) e MongoIterable.forEach(Block). Fissaggio questo richiede soluzioni alternative come la digitazione in modo esplicito il parametro:

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

o, in alternativa, trattando MongoIterable come una pianura Stream:

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

Perché MongoIterable.forEach non definito utilizzando l'interfaccia Consumer, qualcosa come: MongoIterable.forEach(Consumer<? super TResult> consumer)? Ancora meglio - perché lo forEach nel MongoIterable?

risposta

3

Il driver Java supporta ancora Java 6 come destinazione. Quindi, mentre i tentativi erano fatti per rendere il driver 3.0 Java 8 e lambda friendly, non potevamo usare le reali interfacce Java 8.

+0

Questo spiega perché Consumer non viene utilizzato, ma non sono ancora chiaro perché abbia MongoIterable.forEach in primo luogo. È per dare agli utenti non Java 8 un'esperienza simile a Java 8? –

+0

Lo scopo era renderlo più amichevole. La giuria è ancora fuori se questo obiettivo è stato raggiunto o meno. – evanchooly

+1

Sarebbe stato carino avere un nome diverso per evitare la classe del nome, come 'forEachMongo' (o forse un nome ancora più interessante?). Fortunatamente un cast di tipo semplice risolve il problema. –

Problemi correlati