(यह शायद https://stackoverflow.com/a/30312177/160137 से संबंधित है, लेकिन मुझे डर है कि मुझे अभी भी यह नहीं मिला है। इसलिए मैं इस सवाल से इस तरह से पूछ रहा हूं कि उम्मीद है कि इससे जवाब मिलेगा, मैं आसानी से समझ सकता हूं।)संग्राहक.तोलिस्ट() आदिम संग्रह पर क्यों काम नहीं करता है?
आम तौर पर जब मैं एक स्ट्रीम है मैं एक संग्रह कलेक्टरों कक्षा में स्थिर तरीकों में से एक का उपयोग करने के रूपांतरित कर सकते हैं: के रूप में,
List<String> strings = Stream.of("this", "is", "a", "list", "of", "strings")
.collect(Collectors.toList());
इसी तरह की प्रक्रिया आदिम धाराओं पर काम नहीं करता है, तथापि अन्य ने ध्यान दिया है:
IntStream.of(3, 1, 4, 1, 5, 9)
.collect(Collectors.toList()); // doesn't compile
मैं इस के बजाय कर सकते हैं:
IntStream.of(3, 1, 4, 1, 5, 9)
.boxed()
.collect(Collectors.toList());
या मैं यह कर सकता:
IntStream.of(3, 1, 4, 1, 5, 9)
.collect(ArrayList<Integer>::new, ArrayList::add, ArrayList::addAll);
सवाल है, क्यों Collectors.toList() सिर्फ आदिम धाराओं के लिए ऐसा नहीं करता है? क्या यह है कि लपेटा प्रकार निर्दिष्ट करने का कोई तरीका नहीं है? यदि हां, तो यह क्यों काम नहीं करता है:
IntStream.of(3, 1, 4, 1, 5, 9)
.collect(Collectors.toCollection(ArrayList<Integer>::new)); // nope
किसी भी अंतर्दृष्टि की सराहना की जाएगी।
क्योंकि (जावा -8 में भी), कोई 'सूची' नहीं है। आदिम प्रकार ** ** 'ऑब्जेक्ट' नहीं हैं। –
हस्ताक्षर में जेनेरिक केवल प्राचीन प्रकार के साथ काम नहीं करेंगे। इस के रूप में सरल। – Dici
'बॉक्सिंग()' को स्पष्ट रूप से कॉल करने और आदिम धाराओं पर बॉक्स किए गए संग्राहक को अनुमति देने के बीच कोई कार्यात्मक अंतर नहीं है। यदि आप पूछ रहे हैं कि सुविधा के लिए इसकी अनुमति क्यों नहीं थी, तो शायद डिजाइनर मुक्केबाजी को स्पष्ट रूप से स्पष्ट करना चाहते थे। – shmosel