मैं समझता हूं कि जावा स्ट्रीम ऑब्जेक्ट forked stream की अनुमति नहीं देता है। लेकिन यह कल्पना करना भी उचित है कि कोई एक ही स्ट्रीम में कई कार्य करेगा। मान लें कि मैं वस्तुओं की एक सूची को मैप करना चाहता हूं, लेकिन सभी वस्तुओं में एक माप भी जोड़ना चाहता हूं। मैं जानना चाहता हूं कि सूची में डेटा डंप किए बिना ऐसा करना संभव है या नहीं।

Stream<Thing> thingStream = ...;
int accumulation = thingStream.mapToInt(Thing::measure).sum();
List<Another> results = thingStream.map(t -> toAnother(t)).collect(toList());

मुझे पता है कि Stream#peek का उपयोग करना संभव है, लेकिन यह हैकी लगता है।

0
ZDproject 3 जुलाई 2018, 22:01

1 उत्तर

सबसे बढ़िया उत्तर

आप स्ट्रीम पर केवल एक टर्मिनल ऑपरेशन (जैसे: योग, गिनती, संग्रह ..) को कॉल कर सकते हैं, इसलिए उत्तर नहीं है, आप 2 अलग-अलग टर्मिनल संचालन करने के लिए एक ही स्ट्रीम का उपयोग नहीं कर सकते हैं आपने निर्दिष्ट किया।

दस्तावेज़ीकरण कहते हैं:

टर्मिनल ऑपरेशन के बाद, स्ट्रीम पाइपलाइन को खपत माना जाता है, और अब इसका उपयोग नहीं किया जा सकता है; यदि आपको उसी डेटा स्रोत को फिर से पार करने की आवश्यकता है, तो आपको एक नई स्ट्रीम प्राप्त करने के लिए डेटा स्रोत पर वापस लौटना होगा। लगभग सभी मामलों में, टर्मिनल संचालन उत्सुक हैं, लौटने से पहले डेटा स्रोत और पाइपलाइन के प्रसंस्करण के अपने ट्रैवर्सल को पूरा करना। केवल टर्मिनल ऑपरेशन इटरेटर () और स्प्लिटरेटर () नहीं हैं; ये एक "एस्केप हैच" के रूप में प्रदान किए जाते हैं ताकि ग्राहक-नियंत्रित पाइपलाइन ट्रैवर्सल को सक्षम किया जा सके, इस घटना में कि मौजूदा संचालन कार्य के लिए पर्याप्त नहीं हैं।

0
NiVeR 3 जुलाई 2018, 22:05