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?
The Java driver still supports Java 6 as a target. So while the attempts were made to make the 3.0 driver Java 8 and lambda friendly, we couldn't use actual Java 8 interfaces.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With