हां, ऐसा करने का एक तरीका है, लेकिन कुछ सीमाओं के साथ।
Stream<Integer> infiniteStream = Stream.iterate(0, x -> new Integer(x + 1));
Iterator<Integer> iter = infiniteStream.iterator();
Integer zero = iter.next();
Integer one = iter.next();
वैकल्पिक रूप से,
Stream<Integer> infiniteStream = Stream.iterate(0, x -> new Integer(x + 1));
Spliterator<Integer> spliterator = infiniteStream.spliterator();
spliterator.tryAdvance(i -> System.out.println(i)); // zero
spliterator.tryAdvance(i -> System.out.println(i)); // one
को देखते हुए एक Stream
, यह इसे से एक Iterator
या Spliterator
प्राप्त करना संभव है, या क्या यह एक समानांतर धारा के प्रश्न के, आदि ये BaseStream
इंटरफेस पर परिभाषित कर रहे हैं, Stream
का एक सुपरइंटरफेस, जो उन्हें याद करने में थोड़ा आसान बनाता है।
इस मामले में हम जानते हैं धारा अनंत है, तो इटरेटर के hasNext()
विधि कॉल करने या Spliterator के tryAdvance()
सीमा की वापसी मान की जाँच करने की कोई जरूरत नहीं है कि दोनों iterator()
और spliterator()
के तरीके Stream
टर्मिनल ऑपरेशंस जिसका अर्थ है कि उन्हें कॉल करने के बाद, लौटा हुआ इटरेटर या स्प्लिटरेटर स्ट्रीम द्वारा प्रतिनिधित्व किए गए मानों तक विशेष पहुंच प्राप्त करता है। स्ट्रीम पर आगे के संचालन (जैसे कि filter
या map
और आगे) की अनुमति नहीं है और IllegalStateException
से मुलाकात की जाएगी।
आप पहले दो तत्वों से दूर छील करने के लिए और फिर स्ट्रीम प्रसंस्करण को फिर से शुरू करना चाहता था, तो आप एक spliterator वापस एक धारा में तो जैसे बदल सकती है:
Stream<Integer> stream2 = StreamSupport.stream(spliterator, false);
यह शायद कुछ बातों के लिए ठीक काम करेंगे, लेकिन मैं मुझे यकीन नहीं है कि मैं सामान्य रूप से इस तकनीक की सिफारिश करता हूं। मुझे लगता है कि यह कुछ अतिरिक्त वस्तुओं को जोड़ता है और इस प्रकार अगले तत्व के उत्पादन के रास्ते में अतिरिक्त विधि कॉल करता है।
संपादकीय टिप्पणियां (नहीं आपके प्रश्न से संबंधित):
new Integer(val)
प्रयोग न करें। इसके बजाय Integer.valueOf(val)
का उपयोग करें जो कि उपलब्ध होने पर बॉक्स किए गए पूर्णांक का पुन: उपयोग करेगा, जो आमतौर पर श्रेणी -128 से 127 के मानों के लिए सच है।
- आप के बजाय
IntStream
का उपयोग कर सकते हैं जो पूरी तरह मुक्केबाजी ओवरहेड से बचाता है। इसमें स्ट्रीम ऑपरेशंस का पूर्ण पूरक नहीं है, लेकिन इसमें iterate()
है जो एक ऐसा कार्य करता है जो आदिम int
मानों पर संचालित होता है।
आप वास्तव में निकाले गए आइटम का उपयोग करने के लिए देख रहे हैं, या बस उन्हें त्यागें? उत्तरार्द्ध के लिए, '.skip (n)' ऐसा करने का तरीका है। –