सामान्य कमी का मतलब दो अपरिवर्तनीय मूल्यों जैसे कि इंट, डबल, इत्यादि को मिलाना और एक नया उत्पादन करना है; यह एक अपरिवर्तनीय कमी है। इसके विपरीत, कलेक्ट विधि को एक कंटेनर को म्यूट करने के लिए डिज़ाइन किया गया है , जिसके परिणाम का उत्पादन करना चाहिए।
समस्या को स्पष्ट करने के लिए, मान लीजिए कि आप Collectors.toList()
एक साधारण कमी का उपयोग करके प्राप्त करना चाहते हैं
List<Integer> numbers = stream.reduce(
new ArrayList<Integer>(),
(List<Integer> l, Integer e) -> {
l.add(e);
return l;
},
(List<Integer> l1, List<Integer> l2) -> {
l1.addAll(l2);
return l1;
});
इस के बराबर है Collectors.toList()
। हालाँकि, इस मामले में आप म्यूट करते हैं List<Integer>
। जैसा कि हम जानते हैं कि ArrayList
यह थ्रेड-सुरक्षित नहीं है, और न ही इसे से मानों को जोड़ने / हटाने के लिए सुरक्षित है, ताकि आप या तो समवर्ती अपवाद या ArrayIndexOutOfBoundsException
या किसी भी प्रकार का अपवाद प्राप्त करेंगे (विशेषकर जब समानांतर में चलते हैं) जब आप सूची या कॉम्बिनेटर को अपडेट करते हैं। सूचियों को मर्ज करने का प्रयास करता है क्योंकि आप पूर्णांकों को इसमें जमा (जोड़) कर सूची को परिवर्तित कर रहे हैं। यदि आप इस थ्रेड-सेफ़ को सुरक्षित बनाना चाहते हैं, तो आपको हर बार एक नई सूची पास करनी होगी जो प्रदर्शन को ख़राब कर देगी।
इसके विपरीत, Collectors.toList()
एक समान फैशन में काम करता है। हालाँकि, यह थ्रेड सुरक्षा की गारंटी देता है जब आप सूची में मान जमा करते हैं। विधि के लिए प्रलेखनcollect
से :
एक कलेक्टर का उपयोग करके इस धारा के तत्वों पर एक परिवर्तनशील कमी ऑपरेशन करता है। यदि धारा समानांतर है, और कलेक्टर समवर्ती है, और या तो धारा अनियंत्रित है या कलेक्टर अनियंत्रित है, तो एक समवर्ती कमी का प्रदर्शन किया जाएगा। जब समानांतर में निष्पादित किया जाता है, तो कई मध्यवर्ती परिणाम तत्काल डेटा संरचनाओं के अलगाव को बनाए रखने के लिए त्वरित, आबाद और विलय हो सकते हैं। इसलिए, यहां तक कि जब गैर-थ्रेड-सुरक्षित डेटा संरचनाओं (जैसे ArrayList) के साथ समानांतर में निष्पादित किया जाता है, तो समानांतर कमी के लिए कोई अतिरिक्त सिंक्रनाइज़ेशन की आवश्यकता नहीं होती है।
तो आपके प्रश्न का उत्तर देने के लिए:
आप कब उपयोग करेंगे collect()
बनाम reduce()
?
यदि आप इस तरह के रूप में अपरिवर्तनीय मान हो ints
, doubles
, Strings
तो सामान्य कमी सिर्फ ठीक काम करता है। हालाँकि, यदि आपको reduce
अपने मानों को एक List
(म्यूटेबल डेटा स्ट्रक्चर) कहना है, तो आपको collect
विधि के साथ म्यूटेबल कमी का उपयोग करना होगा ।