जावा 8 स्ट्रीम एपीआई में एक साथ कैसे () और allMatch () काम करता है


10

मुझे नीचे दिए गए तरीके के रूप में जावा 8 स्ट्रीम एपीआई के बारे में एक प्रश्नोत्तरी मिली

Arrays.asList("Fred", "Jim", "Sheila")
      .stream()
      .peek(System.out::println)
      .allMatch(s -> s.startsWith("F"));

आउटपुट है

Fred
Jim

मुझे भ्रम है कि यह धारा कैसे काम करती है? मेरा अपेक्षित परिणाम होना चाहिए

Fred
Jim
Sheila

झांकना () विधि एक मध्यवर्ती संचालन है और यह स्ट्रीम में प्रत्येक तत्व को संसाधित करता है। क्या कोई मुझे यह समझा सकता है।

जवाबों:


10

यह एक धारा अनुकूलन है जिसे शॉर्ट-सर्किटिंग के रूप में जाना जाता है। अनिवार्य रूप से, ऐसा होता है कि धारा पर allMatchअनावश्यक मध्यवर्ती संचालन के निष्पादन को रोकता है , क्योंकि अंतिम परिणाम ज्ञात होने पर उन्हें प्रदर्शन करने का कोई मतलब नहीं है।

ऐसा लगता है जैसे यह हुआ है:

take"Fred"
peek("Fred")
evaluate("Fred".startsWith("F"))
decide whether the result of allMatch() is known for sure: Not yet

take"Jim"
peek("Jim")
evaluate("Jim".startsWith("F"))
decide whether the result of allMatch() is known for sure: Yes

जब "Jim".startsWith("F")मूल्यांकन किया allMatch(s -> s.startsWith("F"))जाता है, तो निश्चित के लिए जाना जाता है। इससे कोई फर्क नहीं पड़ता कि मूल्यों पाइप लाइन में आ के बाद "Jim", हम जानते हैं कि सभी मूल्यों 'एफ' के साथ शुरू है झूठी

यह peek/ allMatchसंयोजन के लिए विशिष्ट नहीं है , कई मध्यवर्ती और टर्मिनल शॉर्ट-सर्कुलेटिंग ऑपरेशन हैं। java.util.streamपैकेज की डॉक्स स्थिति:

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

इसे परिमित धाराओं में विस्तारित करें, और लघु-परिचालित संचालन आपके उदाहरण के मामले में अनावश्यक पाइपलाइन चरणों के निष्पादन को कम करते हैं।


5
Arrays.asList("Fred", "Jim", "Sheila")
      .stream()
      .peek(System.out::println)
      .allMatch(s -> s.startsWith("F"));
  • पहली बार के माध्यम से, Fredमुद्रित किया जाता है। यह मेल खाता है
  • दूसरी बार के माध्यम से, Jimमुद्रित किया जाता है। यह सब से मेल नहीं खाता है, क्योंकि "सभी का मिलान नहीं हुआ"
  • इसलिए धारा से अंतिम वस्तु का उपभोग नहीं किया गया था।

3

डॉक्स के लिए peekविधि कहते हैं (जोर मेरा):

इस धारा के तत्वों से मिलकर एक धारा लौटाता है, इसके अतिरिक्त प्रत्येक तत्व पर प्रदत्त क्रिया करता है क्योंकि परिणामी धारा से तत्वों की खपत होती है

तो इस मामले में, peekयह नहीं देखा "Sheila"क्योंकि उस मूल्य का उपयोग स्ट्रीम से नहीं किया जाता है। जैसे ही "Jim"उपभोग किया गया था, का परिणाम .allMatch(s -> s.startsWith("F"))पहले से ही जाना जाता है false, इसलिए स्ट्रीम से किसी भी अधिक तत्वों का उपभोग करने की आवश्यकता नहीं है।


1

AllMatch के जावा डॉक्टर के अनुसार ():

इस धारा के सभी तत्व प्रदान किए गए विधेय से मेल खाते हैं या नहीं। यदि परिणाम निर्धारित करने के लिए आवश्यक नहीं है, तो सभी तत्वों पर विधेय का मूल्यांकन न करें। यदि स्ट्रीम खाली है तो {@code true} वापस आ जाता है और विधेय का मूल्यांकन नहीं किया जाता है।

@apiNote

यह विधि धारा के तत्वों (सभी x P (x) के लिए) पर विधेय के सार्वभौमिक परिमाणीकरण का मूल्यांकन करती है । यदि धारा खाली है, तो परिमाणीकरण को रिक्त रूप से संतुष्ट कहा जाता है और यह हमेशा {@code true} (पी (x) की परवाह किए बिना) होता है।

इस धारा के तत्वों पर लागू करने के लिए विधेय करें @return {@code true} यदि धारा के सभी तत्व प्रदत्त विधेय से मेल खाते हैं या धारा रिक्त है, अन्यथा {@code false}

आपके मामले में:

1-

p(x) : s -> s.startsWith("F")

X : "Fred"

result : X P(X) = true

2-

p(x) : s -> s.startsWith("F")

X : "Jim"

result : X P(X) = false

आगे कोई मूल्यांकन नहीं होगा, क्योंकि एक्सपी (एक्स) = गलत है

boolean result = Arrays.asList("Fred", "Finda", "Fish")
            .stream()
            .peek(System.out::println)
            .allMatch(s -> s.startsWith("F"));
    System.out.println("Result "+result);

आउटपुट है:

Fred
Finda
Fish
Result true

यहाँ पूरी तरह से संसाधित प्रक्रिया है क्योंकि xP (x) = प्रत्येक तत्व से सच है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.