MongoIterable.forEach
requires a Block
which is very similar to Java 8 Consumer
.
They are similar enough to cause problems, for example, the following doesn't compile:
MongoIterable<Document> result = collection.find(...);
result.forEach(System.out::println);
because the compiler can't decide between Iterable.forEach( Consumer )
and MongoIterable.forEach( Block )
. Fixing this requires workarounds like explicitly typing the parameter:
Block<Document> printer = System.out::println;
result.forEach(printer);
or alternatively, treating MongoIterable
as a plain Stream
:
StreamSupport.stream(result.spliterator(), false).forEach(System.out::println);
Why is MongoIterable.forEach
not defined using the Consumer
interface, something like: MongoIterable.forEach(Consumer<? super TResult> consumer)
? Even better - why have forEach
in MongoIterable
at all?