क्या कलेक्शन.स्ट्रीम ()। फिल्टर ()। फॉरेक्स () प्रत्येक लूप के लिए एक मानक की तुलना में अक्षम है?


15

IntelliJ IDEA ने मुझे अभी-अभी प्रत्येक लूप को Java 8 "forEach" कॉल के साथ बदलने की सिफारिश की:

    for (Object o : objects) {
        if (o instanceof SomeObject) {
            doSomething();
        }
    }

अनुशंसित कॉल इस तरह होगा:

objects.stream().filter(o -> o instanceof SomeObject).forEach(o -> doSomething());

जब तक मुझे यह गलतफहमी नहीं है कि स्ट्रीम की अंतर्निहित कार्यक्षमता कैसे काम करती है, तो मुझे ऐसा लगता है कि स्ट्रीम का उपयोग करना ओ (2 एन) ऑपरेशन है, जो प्रत्येक लूप के मानक के लिए ओ (एन) ऑपरेशन के विपरीत है।


8
आपको क्यों लगता है कि यह O ^ 2 है? वास्तव में, धाराओं का आविष्कार विशेष रूप से (ए) के लिए किया गया था जो अच्छे सिंटैक्स की अनुमति देते हैं और (बी) अतिरिक्त ओवरहेड का परिचय नहीं देते हैं। (वास्तव में, वे अक्सर आलसी मूल्यांकन के माध्यम से ओवरहेड को कम करते हैं।)
किलियन फोथ

सिंटैक्स पर आधारित, ऐसा लगता है कि यह फ़िल्टर करने के लिए पहले पुनरावृत्त है और फिर फ़िल्टर्ड ऑब्जेक्ट्स पर दूसरी बार मेरे कोड को चलाने के लिए पुनरावृत्त करता है।
मिराना

6
यहां तक ​​कि अगर यह किया कि अभी भी O (2 * N) होगा, जो O (N) है, अर्थात रैखिक और द्विघात नहीं। लेकिन वास्तव में पुनरावृत्तियों को एक-दूसरे के साथ जोड़ा जाता है, और यदि परिणाम पहले से ही ज्ञात है, तो दोनों जल्दी समाप्त हो सकते हैं - यही धाराओं की सुंदरता है। यह निश्चित रूप से जावा 8 में धाराओं पर पढ़ने के लिए 15 मिनट खर्च करने लायक है; जैसा कि वेंकट सुब्रमण्यम लिखते हैं, '' लैम्ब्डा एक्सप्रेशन जावा 8 की गेटवे ड्रग है, लेकिन स्ट्रीम्स ही असली लत हैं। ''
किलियन फोथ

1
इसके अलावा: आपका लूप एक एंटीपैटर्न है;)
थॉमस जंक

1
@ThomasJunk क्या आप बता सकते हैं कि यह एक एंटीपैटर्न कैसे है? मैं इससे परिचित नहीं हूं।
मिराणा Mir

जवाबों:


21

सिंटैक्स का तात्पर्य है कि प्रत्येक स्टेटमेंट के लिए जावा स्ट्रीम आपके संग्रह के माध्यम से एक बार पुनरावृत्ति नहीं करती है। यह पूरी श्रृंखला को प्रत्येक तत्व, एक समय में एक तत्व पर लागू करता है।

आपके मामले में, धारा बिल्कुल लूप की तरह काम करेगी। एक तत्व ले लो, इसे अपने विधेय के खिलाफ जांचें और फिर अपना ऑपरेशन लागू करें, फिर अगले तत्व पर जाएं।

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