2017-10-28 11 views
8

मैं कोड निम्नलिखित है:जावा धारा अप्रत्याशित परिणाम

Stream.of("Java", "Stream", "Test") 
     .peek(s -> System.out.print(s + " ")) 
     .allMatch(s -> s.startsWith("J")); 

यह मुझे क्यों मुद्रित करता जावा स्ट्रीम?

+1

यह भी देखें [जावा स्ट्रीम में वास्तव में केवल डीबगिंग के लिए सबसे अच्छा है?] (Https://stackoverflow.com/a/33636377/2711488) – Holger

+0

सोचने के लोकप्रिय तरीके (और वास्तविक कार्यान्वयन) के विपरीत धाराओं के बारे में सोचना बेहतर है जैसे कि अंतिम ऑपरेशन धाराओं के बजाए तत्वों को खींच रहा था, उन्हें धक्का दे रहा था। – Dariusz

उत्तर

10

allMatchशॉर्ट-सर्किटिंग ऑपरेशन है क्योंकि अधिकांश स्ट्रीम ऑपरेशन हैं। चूंकि allMatch जल्दी लौट आया है इसलिए peek केवल पहले दो तत्वों को प्रिंट कर रहा है।

2

क्योंकि allMatch() जांचता है कि स्ट्रीम में हर कोई तत्व सत्य है या नहीं। और चूंकि दूसरा झूठा था, इसे आगे की जांच करने की आवश्यकता नहीं है।

तो peek() तीसरे तत्व को मुद्रित नहीं करेगा।

+0

हाँ, मुझे समझ में आया कि यह प्रत्येक तत्व के लिए निष्पादित नहीं किया गया था और यह मेरा सवाल था - क्यों? तो आप कहते हैं कि यह दूसरे तत्व पर निष्पादन बंद कर दिया और यही कारण है कि मैं केवल दो मान देखता हूं? – asdasdsdf

+0

हां। क्योंकि 'allMatch()' के लिए दूसरा तत्व गलत था, स्ट्रीम समाप्त हो जाती है। –

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