मेरे पास एक नेस्टेड स्ट्रीम है जिसका उपयोग मैं किसी आवश्यकता से संबंधित कुछ डेटा को संसाधित करने के लिए कर रहा हूं

final Map<String, Long> productModelQuantityReturnedMap = new HashMap<>();

sampleList.stream()
          .map(sampleModel -> {
              sampleModel.getEntries()
                         .stream()
                         .filter(entryModel -> Objects.nonNull(entryModel.getOrderEntry()))
                         .map(returnEntryModel -> {
                            sampleMap.put(
                              key,
                              val);
                            return null;
                      }).close();
              return null;
        }).close();

हाँ, मुझे पता है कि प्रत्येक के लिए या के लिए उपयोग करना आदर्श होगा लेकिन हाँ। मैं इसे आगे बढ़ने वाले समानांतर धागे तक विस्तारित करना चाहता था क्योंकि इसमें बहुत सारे डेटा बिंदु हैं जो एक दूसरे पर निर्भर नहीं हैं।

हालाँकि यह कहता है कि धारा या समानांतर धारा तब तक प्रतीक्षा करेगी जब तक कि आंतरिक भाग नहीं हो जाता, यह सीधे बाहरी धारा के close() पर चला जाता है, जो मुझे समझ में नहीं आता है।

क्या कोई यहां इस मुद्दे को खोजने में मेरी मदद कर सकता है?

-2
Ayeshmantha Perera 26 नवम्बर 2021, 13:24

1 उत्तर

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

map और filter इंटरमीडिएट ऑपरेशन हैं। जब तक एक टर्मिनल ऑपरेशन लागू नहीं किया जाता है, तब तक एक स्ट्रीम संसाधित नहीं होती है। यहां आपके कोड में आप किसी टर्मिनल ऑपरेशन का आह्वान नहीं कर रहे हैं ताकि स्ट्रीम संसाधित हो। चूंकि close एक टर्मिनल ऑपरेशन नहीं है, इसलिए यह स्ट्रीम को प्रोसेस नहीं करता है। यह बस सब कुछ रीसेट करता है और स्ट्रीम को समाप्त करता है। close का सोर्स कोड देखने के लिए आप AbstractPipeline देख सकते हैं। केवल एक चीज जो निष्पादित की जाती है वह कोड है, यदि कोई हो, जिसे onClose विधि का उपयोग करके पारित किया गया था। (यानी अगर आपने स्ट्रीम पर onClose का इस्तेमाल किया है, stream().onClose(() -> myCloseAction())....)।

साथ ही, आपके द्वारा पोस्ट किए गए कोड में close की वास्तव में आवश्यकता नहीं है। जैसा कि आपने प्रश्न में ही उल्लेख किया है, आप forEach का उपयोग कर सकते हैं। यह निश्चित रूप से समानांतर धाराओं के साथ भी काम करता है (प्रत्येक के लिए)। केवल एक चीज यह है कि ऐसा लगता है कि आपका कोड नक्शा अपडेट कर रहा है। सुनिश्चित करें कि यह एक समवर्ती नक्शा है। या forEach का उपयोग करके मानचित्र के अंदर तत्वों को डालने के बजाय Collectors वर्ग से toMap या toConcurrentMap का उपयोग करना बेहतर है।

1
Gautham M 26 नवम्बर 2021, 15:51
1
या स्ट्रीम एपीआई का उपयोग इरादा की तरह करें, उदा। Map<String, Long> productModelQuantityReturnedMap = sampleList.stream() .flatMap(sampleModel -> sampleModel.getEntries().stream()) .filter(entryModel -> entryModel.getOrderEntry() != null) .collect(Collectors.toMap(e -> …, e -> …)); अनिवार्य प्रोग्रामिंग प्रतिमानों को लागू करने की कोशिश करने के बजाय। यह स्पष्ट नहीं है कि अंतिम कार्यों के लिए क्या भरना है, क्योंकि प्रश्न के कोड ने कभी संकलक नहीं देखा है।
 – 
Holger
26 नवम्बर 2021, 15:23