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
?
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? –
Lo scopo era renderlo più amichevole. La giuria è ancora fuori se questo obiettivo è stato raggiunto o meno. – evanchooly
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. –