2016-12-27 12 views
7

दूसरे शब्दों में, num लाइनों को मुद्रित करने के लिए निम्न पंक्ति guranteed है?क्या Stream.count() प्रत्येक तत्व पर जाने के लिए guranteed है?

int num = list.stream().peek(System.out::println).count(); 

यह सवाल https://stackoverflow.com/a/41346586/2513200

मैं थोड़ा एक चर्चा है कि अनुकूलन कि यात्रा से बचने के कानूनी हो सकता है याद की टिप्पणियों में एक चर्चा से शुरू हो रहा था, लेकिन एक त्वरित खोज के दौरान कुछ भी निर्णायक नहीं मिला।

JavaDocs for Stream.count इस बयान होते हैं:

इस कमी का एक विशेष मामला है और के बराबर है:
return mapToLong(e -> 1L).sum();

लेकिन मुझे यकीन है कि क्या यह यदि कोई गारंटी देता है प्रदान करता है नहीं कर रहा हूँ धारा किसी भी तरह से शॉर्ट-सर्किटिंग तरीके से परिणाम निर्धारित कर सकती है।

+3

इसे जावा 9 में संशोधित किया जाएगा (एपीआई नोट देखें): http://download.java.net/java/jdk9/docs/api/java/util/stream/Stream.html#count-- –

+0

_result_ आवश्यक है, यह कुछ भी निष्पादित करने की गारंटी नहीं है। – Cubic

+4

प्रलेखन के उस हिस्से के ठीक बाद, आप पाएंगे: "एक कार्यान्वयन स्ट्रीम पाइपलाइन निष्पादित नहीं कर सकता है [...] यदि यह सीधे धारा स्रोत से गणना की गणना करने में सक्षम है। ऐसे मामलों में कोई स्रोत तत्व नहीं होगा उलटा हो और कोई मध्यवर्ती संचालन का मूल्यांकन नहीं किया जाएगा। " –

उत्तर

13

नहीं, यह नहीं है। यह जावा 9 में इसेकार्यान्वयन के कारण नहीं करेगा (अगर स्ट्रीम आकार अग्रिम में जाना जाता है, तो यह पुनरावृत्ति को छोड़ देगा)। अधिक जानकारी के लिए

JDK-8067969 देखें। JDK-9 में प्रलेखन तदनुसार अद्यतन किया गया था:

कार्यान्वयन धारा पाइपलाइन (या तो क्रमिक रूप से या समानांतर में) पर अमल नहीं करने के लिए अगर यह गिनती सीधे कंप्यूटिंग धारा स्रोत से करने में सक्षम है चुन सकते हैं। ऐसे मामलों में कोई स्रोत तत्व नहीं जायेगा और कोई मध्यवर्ती संचालन का मूल्यांकन नहीं किया जाएगा। साइड इफेक्ट्स के साथ व्यवहार पैरामीटर, जो डिबगिंग जैसे हानिरहित मामलों को छोड़कर दृढ़ता से निराश होते हैं, प्रभावित हो सकते हैं।

+2

बैकिंग स्प्लिटरेटर SIZED होने पर अधिकतर पुनरावृत्ति को छोड़ दिया जाएगा। –

+1

@ जीन-फ्रैंकोइसवार्ड, यदि अंतिम स्ट्रीम में SIZED StreamOpFlag है तो अधिक सटीक होने के लिए। StreamOpFlags स्प्लिटरेटर विशेषताओं के समान हैं, लेकिन कुछ हद तक अलग हैं। यदि आपके पास इंटरमीडिएट ऑपरेशंस हैं, तो आपके पास उनके लिए स्प्लिटरेटर नहीं है, लेकिन आपके पास StreamOpFlags है। मध्यवर्ती 'मानचित्र()' या 'peek()' के साथ आप ठीक हैं, लेकिन मध्यवर्ती 'फ़िल्टर()' या 'विशिष्ट()' SIZED को साफ़ कर देगा। –

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