2017-11-01 6 views
6

जावा Stream.forEach फ़ंक्शन में गंभीर सीमा है कि इसके उपभोक्ता के लिए चेक अपवाद फेंकना असंभव है। इस प्रकार, मैं एक स्ट्रीम के तत्वों को एक-एक करके एक्सेस करना चाहता हूं।एक स्ट्रीम को एक-एक करके कैसे पढ़ा जाए?

मैं इस तरह कुछ करना चाहता हूँ:

while(true) { 
    Optional<String> optNewString = myStream.findAny(); 

    if (optNewString.isPresent()) 
     doStuff(optNewString.get()); 
    else 
     break; 
} 

हालांकि, findAny एक शॉर्ट-सर्किट टर्मिनल ऑपरेशन है। यही है, यह धारा बंद कर देता है। यह कोड थोड़ी देर के लूप के दूसरे पुनरावृत्ति पर दुर्घटनाग्रस्त हो जाएगा। मैं बस सभी तत्वों को सरणी के अंदर नहीं डाल सकता, और उस सरणी पर एक-एक करके जा सकता हूं, क्योंकि संभावित रूप से लाखों तत्व हैं।

कृपया ध्यान दें कि मैं forEach के भीतर से अपवाद फेंकने के लिए नहीं कह रहा हूं। इस प्रश्न में already been answered है।

+8

आपको बस यह स्वीकार करना होगा कि चेक अपवाद एक बुरा विचार थे, और स्ट्रीम और कार्यात्मक प्रोग्रामिंग के साथ अच्छी तरह से फिट नहीं होते हैं। तो उन्हें पकड़ो और उन्हें रनटाइम अपवादों में लपेटें। –

+0

@JBNizet निश्चित रूप से, यह काम करता है, और मैं वर्तमान में 'LambdaException' प्रकार का उपयोग कर कर रहा हूं। सिर्फ इसलिए कि यह काम करता है इसका मतलब यह नहीं है कि यह अच्छी तरह से लिखा गया है, और हमेशा सुधार के लिए जगह है। इसके अलावा, स्ट्रीम के अगले तत्व की प्रतीक्षा करने में सक्षम नहीं होने के कारण एक एपीआई छेद लगता है। –

+0

[यह] (https://stackoverflow.com/questions/20129762/why-does-streamt-not-implement-iterablet) – jrtapsell

उत्तर

11

एक धारा तत्व-दर-तत्व पर पुनरावृति के लिए, बस फोन iterator() विधि:

Iterator<String> iterator = stream.iterator(); 
while (iterator.hasNext()) { 
    String element = iterator.next(); 
    // Use element 
} 

यह किस हद तक आप जांचे हुए अपवादों के मामले में मदद करता है कि करने के लिए स्पष्ट नहीं है, और यह ध्यान देने योग्य बात है कि यह एक है लायक है टर्मिनल ऑपरेशन - एक बार जब आप इटरेटर का उपयोग कर लेते हैं, तो आपको फिर से पुनरावृत्ति करना चाहते हैं तो आपको एक नई स्ट्रीम प्राप्त करने की आवश्यकता होगी - लेकिन यह एक समय में एक धारा को एक तत्व को पढ़ने के तरीके के उत्तर का उत्तर देता है।

+0

चेक अपवाद केवल प्रश्न के संदर्भ थे, लेकिन इससे मदद मिलती है क्योंकि चेक अपवादों को इस तरह फेंक दिया जा सकता है, जबकि वे 'Stream.forEach' के साथ स्ट्रीम पर पुन: सक्रिय नहीं हो सकते हैं। –

संबंधित मुद्दे