यह सर्वविदित है जावाडोक का कहना है कि Stream
के बारे में इंटरफ़ेस:बंद मैप किए गए स्ट्रीम - क्या विचार है?
स्ट्रीम एक BaseStream.close() विधि है और AutoCloseable, लगा देंगी, लेकिन लगभग सभी धारा उदाहरणों वास्तव में उपयोग के बाद बंद कर दिया की जरूरत नहीं है। आम तौर पर, केवल उन स्रोतों को स्ट्रीम करता है जिनके स्रोत आईओ चैनल (जैसे फ़ाइलें.लाइन (पथ, वर्णसेट) द्वारा लौटाए गए हैं) को बंद करने की आवश्यकता होगी। अधिकांश धाराएं संग्रह, सरणी, या फ़ंक्शंस उत्पन्न करती हैं, जिनके लिए कोई विशेष संसाधन प्रबंधन की आवश्यकता नहीं होती है। (एक धारा समापन की आवश्यकता होती है, तो यह एक कोशिश के साथ-संसाधनों बयान में एक संसाधन के रूप में घोषित किया जा सकता है।)
ठीक है, लेकिन वहाँ एक ही समय में इस इंटरफ़ेस में flatMapToInt
तरह तरीके हैं:
IntStream flatMapToInt(Function<? super T, ? extends IntStream> mapper);
जिसके लिए जावाडोक विनिर्देश का कहना है: के बाद इसकी सामग्री इस धारा में रखा गया है
प्रत्येक मैप की धारा बंद कर दिया है। यदि
IntStream
, अपने स्रोत में आईओ चैनल पाने के लिए नहीं बनाया गया है कारण है कि यह इस पद्धति के अंदर बंद कर दिया है:
तो, मैं विचार नहीं मिला था?
उदाहरण के लिए, ReferencePipeline
कार्यान्वयन यह करता है इस तरह से:
try (IntStream result = mapper.apply(u)) {
if (result != null)
result.sequential().forEach(downstreamAsInt);
}
अधिक सामान्य प्रश्न हो सकता है: हम IntStream
(या उसके वंश) या नहीं की तरह धाराओं बंद करने के बारे ध्यान देना चाहिए? यदि नहीं, तो flatMapTo*
देखभाल क्यों करती है?
EDIT @ टुनकी ने बहुत रोचक email link प्रदान किया है। लेकिन यह सब flatMap
है, जहां मैं सहमत हूं कि हमें सामान्य मामले में धारा बंद करनी चाहिए। लेकिन मेरा सवाल विशेष मामलों के बारे में है: flatMapToInt
, flatMapToLong
और इसी तरह, जहां मुझे बंद धाराओं की कोई आवश्यकता नहीं दिखाई देती है।
संपादित -2 @BrianGoetz यहाँ की अपील की है, क्योंकि यह उसकी उद्धृत ईमेल है, इसलिए वह इस विषय में है :)
'flatMapToInt' को' flatMap' से अलग 'का इलाज करने का कोई मतलब नहीं है। एक 'इंटस्ट्रीम' भी संसाधनों को पकड़ सकता है; सिर्फ इसलिए कि पूंछ के अंत से क्या आता है 'int' है, इसका मतलब यह नहीं है कि स्रोत गैर-स्मृति संसाधन से शुरू नहीं हुआ है। उदाहरण के लिए, मान करता 'flatMapToInt' प्रत्येक तत्व का' Files.lines()। mapToInt (स्ट्रिंग :: लंबाई) को flatmapped है '? –