2016-01-07 4 views
6

MongoIterable.forEach को Block की आवश्यकता है जो जावा 8 Consumer के समान है। वे काफी समान समस्याओं के कारण कर रहे हैं, उदाहरण के लिए, निम्नलिखित संकलन नहीं करता है:MongoIterable.forEach बनाम Iterable.forEach

MongoIterable<Document> result = collection.find(...); 
result.forEach(System.out::println); 

क्योंकि संकलक Iterable.forEach(Consumer) और MongoIterable.forEach(Block) के बीच तय नहीं कर सकते। फिक्सिंग यह स्पष्ट रूप से पैरामीटर टाइपिंग की तरह समाधान की आवश्यकता है:

Block<Document> printer = System.out::println; 
result.forEach(printer); 

या वैकल्पिक रूप से, एक सादे Stream रूप MongoIterable इलाज:

StreamSupport.stream(result.spliterator(), false).forEach(System.out::println); 

क्यों MongoIterable.forEachConsumer इंटरफ़ेस का उपयोग कर परिभाषित नहीं है, कुछ की तरह: MongoIterable.forEach(Consumer<? super TResult> consumer)? इससे भी बेहतर - MongoIterable में क्यों है?

उत्तर

3

जावा ड्राइवर अभी भी लक्ष्य के रूप में जावा 6 का समर्थन करता है। इसलिए 3.0 ड्राइवर जावा 8 और लैम्ब्डा दोस्ताना बनाने के प्रयास किए जाने के बाद, हम वास्तविक जावा 8 इंटरफेस का उपयोग नहीं कर सके।

+0

यह बताता है कि उपभोक्ता का उपयोग क्यों नहीं किया जाता है, लेकिन मैं अभी भी स्पष्ट नहीं हूं कि मोंगोइटेबल क्यों है। पहले स्थान पर। क्या यह गैर जावा 8 उपयोगकर्ताओं को जावा 8 अनुभव पसंद है? –

+0

इसका उद्देश्य इसे और अधिक अनुकूल बनाना था। जूरी अभी भी बाहर है अगर वह लक्ष्य हासिल किया गया था या नहीं। – evanchooly

+1

नाम वर्ग से बचने के लिए एक अलग नाम होना अच्छा होगा, जैसे 'forEachMongo' (या शायद यहां तक ​​कि कूलर नाम?)। सौभाग्य से एक साधारण प्रकार का कलाकार इस मुद्दे को हल करता है। –

संबंधित मुद्दे