2016-01-07 13 views
6

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)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?

Trả lời

3

Trình điều khiển Java vẫn hỗ trợ Java 6 làm mục tiêu. Vì vậy, trong khi các nỗ lực đã được thực hiện để làm cho trình điều khiển 3.0 Java 8 và lambda thân thiện, chúng tôi không thể sử dụng giao diện Java 8 thực tế.

+0

Đ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? –

+0

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

+1

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 đề. –

Các vấn đề liên quan