2015-08-24 30 views
10

जावा 8 पर थोड़ा सा पढ़ना, मुझे this ब्लॉग पोस्ट स्ट्रीम और उनके बारे में कुछ समझाने के लिए मिला, और जब कमी को शॉर्ट-सर्किट करना संभव होगा। तल में यह कहा गया है:जावा 8 स्ट्रीम शॉर्ट सर्किट

findFirst या findAny के मामले में

नोट हम केवल पहले मूल्य जो विधेय से मेल खाता है (हालांकि findAny पहले वापस जाने के लिए इसकी गारंटी नहीं है) की जरूरत है। हालांकि अगर स्ट्रीम में कोई ऑर्डर नहीं है तो हम findAny की तरह व्यवहार करने की अपेक्षा करेंगे। ऑपरेशंस allMatch, noneMatch और anyMatch स्ट्रीम को शॉर्ट-सर्किट नहीं कर सकता है क्योंकि यह निर्धारित करने के लिए सभी मानों का मूल्यांकन कर सकता है कि ऑपरेटर true या false है। इस प्रकार इनका उपयोग कर एक अनंत धारा समाप्त नहीं हो सकती है।

मुझे लगता है कि findFirst या findAny शॉर्ट सर्किट में कमी, क्योंकि जैसे ही आप एक तत्व को खोजने के AF, आप आगे किसी भी कार्रवाई करने के लिए की जरूरत नहीं है हो सकता है मिलता है।

लेकिन allMatch, noneMatch और anyMatch के लिए यह क्यों संभव नहीं होगा? allMatch के लिए, यदि आपको कोई ऐसा लगता है जो भविष्यवाणी से मेल नहीं खाता है, तो आप प्रसंस्करण रोक सकते हैं। किसी के लिए वही नहीं। और anyMatch विशेष रूप से मुझे समझ में नहीं आता है, क्योंकि यह findAny (जो लौटाया गया है उसे छोड़कर) के बराबर है?

यह कहकर कि ये तीन शॉर्ट-सर्किट नहीं हो सकते हैं, क्योंकि यह सभी मानों का मूल्यांकन कर सकता है, findFirst/Any के लिए भी कहा जा सकता है।

क्या कुछ मौलिक अंतर है जो मुझे याद आ रही है? क्या मैं वास्तव में समझ नहीं रहा कि क्या हो रहा है?

+0

"शायद नहीं" जैसा "शायद नहीं" जैसा हो, जैसा कि "अनुमति नहीं है"। – Andreas

+0

@ एंड्रियास हां, मुझे यह नहीं मिल रहा है कि अंतर कहां से आता है। जिस तरह से मैं इसे देख रहा हूं, सबको संक्षिप्त सर्किट किया जा सकता है? – Koekje

उत्तर

12

एक सूक्ष्म अंतर है, क्योंकि anyMatch परिवार एक अनुमान का उपयोग करता है, जबकि findAny परिवार नहीं करता है। तकनीकी रूप से findAny()anyMatch(x -> true) और anyMatch(pred) जैसा दिखता है filter(pred).findAny() जैसा दिखता है। तो यहां हमारे पास एक और मुद्दा है। पर विचार करें हम एक सरल अनंत धारा है:

Stream<Integer> s = Stream.generate(() -> 1); 

तो यह सच है कि इस तरह के धारा को findAny() लागू करने के हमेशा शॉर्ट सर्किट और खत्म करते हुए anyMatch(pred) लागू करने जाएगा विधेय पर निर्भर करता है। हालांकि चलिए अपनी अनंत स्ट्रीम फ़िल्टर करते हैं:

Stream<Integer> s = Stream.generate(() -> 1).filter(x -> x < 0); 

परिणामस्वरूप धारा अनंत भी है? यह एक मुश्किल सवाल है। इसमें वास्तव में कोई तत्व नहीं है, लेकिन यह निर्धारित करने के लिए (उदाहरण के लिए, .iterator().hasNext() का उपयोग करके) हमें अंतर्निहित धारा तत्वों की अनंत संख्या की जांच करनी है, इसलिए यह ऑपरेशन कभी खत्म नहीं होगा। मैं इस तरह की धारा को एक अनंत भी कहूंगा। हालांकि इस तरह के धारा दोनों anyMatch और findAny का उपयोग समाप्त कर कभी नहीं होगा:

Stream.generate(() -> 1).filter(x -> x < 0).anyMatch(x -> true); 
Stream.generate(() -> 1).filter(x -> x < 0).findAny(); 

तो findAny(), या तो खत्म करने के लिए गारंटी नहीं है यह पिछले मध्यवर्ती धारा कार्यों पर निर्भर करता है।

निष्कर्ष निकालने के लिए कि मैं उस ब्लॉग-पोस्ट को बहुत भ्रामक मानता हूं। मेरी राय में आधिकारिक JavaDoc में अनंत स्ट्रीम व्यवहार बेहतर समझाया गया है।

+0

स्पष्टीकरण के लिए धन्यवाद! :) – Koekje

1

जब जावाडोक कहता है कि "शॉर्ट सर्किट नहीं हो सकता है" यह केवल यह इंगित कर रहा है कि यह शॉर्ट सर्किट ऑपरेशन नहीं है और मूल्यों के आधार पर, पूरी धारा संसाधित की जा सकती है।

findFirst और findAny दूसरी ओर, शॉर्ट सर्किट की गारंटी है क्योंकि उन्हें संतुष्ट होने के बाद शेष स्ट्रीम को संसाधित करने की आवश्यकता नहीं होती है।

+0

लेकिन यह भविष्यवाणियों के लिए भी हो सकता है, जैसे ही वे संतुष्ट नहीं हैं? – Koekje

0

कोई भी मैच, कोई भी मैच और सभी मैच रिटर्न बूलियन मान, इसलिए उन्हें तर्क साबित करने के लिए सभी को जांचना पड़ सकता है।

ढूंढें सबसे पहले और ढूंढें किसी को भी पहले खोज करने और उसे वापस करने के बारे में कोई परवाह नहीं है।

संपादित करें: किसी दिए गए डेटासेट के लिए मिलान विधियों को हमेशा एक ही मूल्य वापस करने की गारंटी दी जाती है, हालांकि खोज विधियां इसलिए नहीं होतीं क्योंकि ऑर्डर भिन्न हो सकता है और यह मान सकता है कि कौन सा मान वापस आ गया है।

वर्णित शॉर्ट सर्किटिंग किसी दिए गए डेटासेट के लिए स्थिरता की कमी के तरीकों के बारे में बात कर रही है।

+0

लेकिन कोई भी मैच भी करता है? – Koekje

+0

यदि अंतिम मूल्य मैच था, तो हाँ। प्वाइंट यह है कि मिलान विधियां हमेशा एक ही डेटा सेट पर एक ही मान वापस आती हैं, लेकिन खोज विधियों की गारंटी नहीं है क्योंकि स्थिरता क्योंकि ऑर्डर भिन्न हो सकता है। –

+0

स्थिरता की यह कमी –

5

उत्तर अपडेट किया गया

मैं कहेंगे ब्लॉग पोस्ट गलत है जब यह कहते हैं, "findFirst या findAny हम केवल पहले मूल्य जो विधेय से मेल खाता है की जरूरत है"।

allMatch(Predicate), anyMatch(Predicate), noneMatch(Predicate), findAny() के लिए जावाडोक में, और findFirst():

यह एक शॉर्ट-सर्किट टर्मिनल ऑपरेशन है।

हालांकि, ध्यान दें कि findFirst और findAny एक Predicate जरूरत नहीं है। तो वे पहले/किसी भी मूल्य को देखने पर तुरंत लौट सकते हैं। अन्य 3 सशर्त हैं और यदि स्थिति कभी भी आग लगती है तो हमेशा लूप हो सकती है।

+0

वर्णित शॉर्ट सर्किटिंग ब्लॉग से है: "ऑपरेशंस ऑल मैच, noneMatch और anyMatch स्ट्रीम को शॉर्ट-सर्किट नहीं कर सकता है क्योंकि यह निर्धारित करने के लिए कि यह ऑपरेटर सही है या गलत है, सभी मूल्यों का मूल्यांकन कर सकता है। " यह स्पष्ट रूप से गलत है क्योंकि 'ऑलमैच' को पहले गैर-मिलान मिलने के बाद झूठी होने के लिए निर्धारित किया जा सकता है। –

+0

@MiserableVariable जैसा कि मैंने कहा, ब्लॉग पोस्ट गलत है। वे * सभी शॉर्ट सर्किट कर सकते हैं। --- ब्लॉग सही है कि उनमें से 3 * संभावित रूप से * हमेशा के लिए दौड़ सकते हैं, लेकिन यह सब गलत कहता है। – Andreas

1

Oracle की धारा प्रलेखन के अनुसार: https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps

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

यह एक शॉर्ट-सर्किट टर्मिनल ऑपरेशन है:

सभी पांच कार्यों रेखा है।

फ़ंक्शन के विवरण में।

+0

डॉक्टर संदर्भ के लिए धन्यवाद! – Koekje

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