MongoIterable.forEach
yêu cầu Block
rất giống với Java 8 Consumer
. Họ là giống nhau đủ để gây ra vấn đề, ví dụ, sau đây không biên dịch:MongoIterable.forEach vs. Iterable.forEach
MongoIterable<Document> result = collection.find(...);
result.forEach(System.out::println);
vì trình biên dịch không thể quyết định giữa Iterable.forEach(Consumer)
và MongoIterable.forEach(Block)
. Sửa điều này đòi hỏi cách giải quyết như cách gõ một cách rõ ràng thông số:
Block<Document> printer = System.out::println;
result.forEach(printer);
hoặc cách khác, điều trị MongoIterable
như một đồng bằng Stream
:
StreamSupport.stream(result.spliterator(), false).forEach(System.out::println);
Tại sao MongoIterable.forEach
không được định nghĩa bằng cách sử dụng giao diện Consumer
, một cái gì đó như: MongoIterable.forEach(Consumer<? super TResult> consumer)
? Thậm chí tốt hơn - tại sao có tất cả forEach
trong số MongoIterable
?
Điều này giải thích tại sao người tiêu dùng không được sử dụng, nhưng tôi vẫn chưa rõ tại sao MongoIterable.forEach lại là người đầu tiên. Có phải để cung cấp cho người dùng Java 8 không giống như trải nghiệm Java 8 không? –
Nó được thiết kế để làm cho nó thân thiện hơn. Ban giám khảo vẫn ra ngoài nếu mục tiêu đó đã đạt được hay không. – evanchooly
Thật tuyệt khi có một cái tên khác để tránh tên lớp, như 'forEachMongo' (hoặc có thể là một cái tên lạnh hơn?). May mắn là một dàn diễn viên đơn giản giải quyết được vấn đề. –