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 है? वास्तव में, धाराओं का आविष्कार विशेष रूप से (ए) के लिए किया गया था जो अच्छे सिंटैक्स की अनुमति देते हैं और (बी) अतिरिक्त ओवरहेड का परिचय नहीं देते हैं। (वास्तव में, वे अक्सर आलसी मूल्यांकन के माध्यम से ओवरहेड को कम करते हैं।)
—
किलियन फोथ
सिंटैक्स पर आधारित, ऐसा लगता है कि यह फ़िल्टर करने के लिए पहले पुनरावृत्त है और फिर फ़िल्टर्ड ऑब्जेक्ट्स पर दूसरी बार मेरे कोड को चलाने के लिए पुनरावृत्त करता है।
—
मिराना
यहां तक कि अगर यह किया कि अभी भी O (2 * N) होगा, जो O (N) है, अर्थात रैखिक और द्विघात नहीं। लेकिन वास्तव में पुनरावृत्तियों को एक-दूसरे के साथ जोड़ा जाता है, और यदि परिणाम पहले से ही ज्ञात है, तो दोनों जल्दी समाप्त हो सकते हैं - यही धाराओं की सुंदरता है। यह निश्चित रूप से जावा 8 में धाराओं पर पढ़ने के लिए 15 मिनट खर्च करने लायक है; जैसा कि वेंकट सुब्रमण्यम लिखते हैं, '' लैम्ब्डा एक्सप्रेशन जावा 8 की गेटवे ड्रग है, लेकिन स्ट्रीम्स ही असली लत हैं। ''
—
किलियन फोथ
इसके अलावा: आपका लूप एक एंटीपैटर्न है;)
—
थॉमस जंक
@ThomasJunk क्या आप बता सकते हैं कि यह एक एंटीपैटर्न कैसे है? मैं इससे परिचित नहीं हूं।
—
मिराणा Mir