जावा Stream.forEach
फ़ंक्शन में गंभीर सीमा है कि इसके उपभोक्ता के लिए चेक अपवाद फेंकना असंभव है। इस प्रकार, मैं एक स्ट्रीम के तत्वों को एक-एक करके एक्सेस करना चाहता हूं।एक स्ट्रीम को एक-एक करके कैसे पढ़ा जाए?
मैं इस तरह कुछ करना चाहता हूँ:
while(true) {
Optional<String> optNewString = myStream.findAny();
if (optNewString.isPresent())
doStuff(optNewString.get());
else
break;
}
हालांकि, findAny
एक शॉर्ट-सर्किट टर्मिनल ऑपरेशन है। यही है, यह धारा बंद कर देता है। यह कोड थोड़ी देर के लूप के दूसरे पुनरावृत्ति पर दुर्घटनाग्रस्त हो जाएगा। मैं बस सभी तत्वों को सरणी के अंदर नहीं डाल सकता, और उस सरणी पर एक-एक करके जा सकता हूं, क्योंकि संभावित रूप से लाखों तत्व हैं।
कृपया ध्यान दें कि मैं forEach
के भीतर से अपवाद फेंकने के लिए नहीं कह रहा हूं। इस प्रश्न में already been answered है।
आपको बस यह स्वीकार करना होगा कि चेक अपवाद एक बुरा विचार थे, और स्ट्रीम और कार्यात्मक प्रोग्रामिंग के साथ अच्छी तरह से फिट नहीं होते हैं। तो उन्हें पकड़ो और उन्हें रनटाइम अपवादों में लपेटें। –
@JBNizet निश्चित रूप से, यह काम करता है, और मैं वर्तमान में 'LambdaException' प्रकार का उपयोग कर कर रहा हूं। सिर्फ इसलिए कि यह काम करता है इसका मतलब यह नहीं है कि यह अच्छी तरह से लिखा गया है, और हमेशा सुधार के लिए जगह है। इसके अलावा, स्ट्रीम के अगले तत्व की प्रतीक्षा करने में सक्षम नहीं होने के कारण एक एपीआई छेद लगता है। –
[यह] (https://stackoverflow.com/questions/20129762/why-does-streamt-not-implement-iterablet) – jrtapsell