अपने एपीआई को विकसित करने के दौरान, जो किसी भी विरासत कोड से जुड़ा नहीं है, मैं अक्सर खुद को लिखने के तरीके ढूंढता हूं जो कि विशुद्ध रूप से स्ट्रीम पाइपलाइन हैं जो परिणाम एकत्र करके समाप्त हो जाते हैं। इस तरह:
ImmutableSet<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfThing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey)
.collect(MyCustomCollectors.toImmutableSet());
}
अब, इस वर्ग के अधिकांश ग्राहकों को आमतौर पर खोज करने के लिए संग्रह (इस मामले में, एक ImmutableSet) की आवश्यकता होगी और उस पर पुनरावृति हो सकती है, लेकिन कुछ क्लाइंट को स्ट्रीम होने से लाभ हो सकता है, इसलिए वे उस पर शीर्ष पर कुछ और कार्रवाई कर सकते हैं संग्रह से एक नई स्ट्रीम प्राप्त करने की आवश्यकता के बिना स्ट्रीम। इसलिए स्ट्रीम वापस करने से क्लिंस को उन विकल्पों का एक सुपरसेट मिलता है जो उनके पास होता अगर उनके पास सिर्फ कलेक्शन होता (आखिरकार, वे हमेशा collect()
स्ट्रीम खुद कर सकते हैं:
Stream<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfthing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey);
// No collect
}
यह तरीका मेरे लिए लुभावना है क्योंकि मुझे इसमें कोई संभावित खामी नहीं दिखती। हालाँकि, मैंने इस दृष्टिकोण को कभी भी किसी भी पुस्तकालय में नहीं देखा है (शायद यह समझ में नहीं आया कि जावा 8 की उपस्थिति के बाद कई पुस्तकालय जारी किए गए थे), इसलिए मुझे इसे अपनाने में थोड़ा डर है। मौजूदा पुस्तकालय कक्षाएं आमतौर पर निजी राज्य से कुछ प्राप्त करने पर संग्रह लौटा देती हैं।
क्या कुछ बुरा है जो हो सकता है अगर मैं एक स्ट्रीम वापस करने का फैसला करता हूं जहां मेरा पूर्व-जावा -8 स्वयं एक संग्रह लौटाएगा? या शायद मैं एक एंटीपार्टन का कुछ कर रहा हूं जो निजी राज्य से प्राप्त होता है?