2017-01-20 12 views
13

मैं आलसी मूल्यांकन की अवधारणा के लिए नया हूं। जब मैं स्कैला में कोड की इस पंक्ति को निष्पादित करता हूं;स्कैला स्ट्रीम बनाम जावा स्ट्रीम आलस्य अंतर

"12334".grouped(1).toStream.filter{n => println("n:" +n); n=="3";} 

यह पता प्रिंट: चुपचाप कुछ भी लिख लाइन सांत्वना देने के बिना

List<String> myList = new ArrayList<>(Arrays.asList("12334".split(""))); 

Stream<String> myList2 = myList.stream().filter(a -> {System.out.println("a:" +a);return "3".equals(a);}); 

यह समाप्त हो जाता है:

n:1 
n:2 
n:3 

लेकिन जब मैं की तरह जावा में कुछ इसी तरह, चलाते हैं। जावा का व्यवहार मेरे लिए अधिक उचित लगता है क्योंकि स्ट्रीम का आलसी मूल्यांकन किया जाता है और मैंने परिणाम मुद्रित नहीं किया या कोशिश नहीं की। लेकिन स्कैला में भी अगर मैंने स्ट्रीम का उपभोग नहीं किया तो यह कुछ जानकारी प्रिंट करता है। तो मेरा सवाल यह है कि क्या अंतर पैदा कर रहा है?

उत्तर

10

यह इस तथ्य के कारण है कि filter पूरी तरह से आलसी नहीं है।

while (!rest.isEmpty && !p(rest.head)) rest = rest.tail 

कौन सा भौतिकीकरण और Stream की वास्तविक छानने का कारण बनता है: यह कोड के इस टुकड़े है।

आप पूर्ण आलस्य चाहते हैं, withFilter साथ जाना: और अधिक देखने

"12334".grouped(1).toStream.withFilter { n => println("n:" +n); n=="3"; } 

लिए withFilter instead of filter

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