मुझे आश्चर्य है कि Collection.addAll()
विधि केवल Collection
एस स्वीकार करती है लेकिन Iterable
एस नहीं। ऐसा क्यों है?जावा: क्यों संग्रह.addAll Iterables स्वीकार नहीं कर सकता है?
Iterable
एस के लिए ऐसा करने के लिए कोई भी समान विधि?
मुझे आश्चर्य है कि Collection.addAll()
विधि केवल Collection
एस स्वीकार करती है लेकिन Iterable
एस नहीं। ऐसा क्यों है?जावा: क्यों संग्रह.addAll Iterables स्वीकार नहीं कर सकता है?
Iterable
एस के लिए ऐसा करने के लिए कोई भी समान विधि?
संभवतः Collection
इंटरफ़ेस जावा 1.2 में पेश किया गया था जबकि Iterable
केवल 1.5 में दिखाई दिया था, और इंटरफ़ेस बदलने से सभी मौजूदा कार्यान्वयन टूट जाएंगे।
दोह !!! ... आप सही हैं, मैं क्या सोच रहा था। .... हटा रहा है ... और प्लस ऑनिंग – OscarRyz
यह स्पष्ट नहीं करता है कि विधि को बाद में क्यों जोड़ा नहीं गया था। – user48956
@ user48956: हाँ, यह करता है: "इंटरफ़ेस बदलना सभी मौजूदा कार्यान्वयन को तोड़ देगा"। हालांकि यह वास्तव में जावा 8 में डिफ़ॉल्ट विधियों के परिचय के साथ असत्य हो गया। –
असल में क्योंकि Iterable
कभी खत्म नहीं हो सकता है (यानी, hasNext()
हमेशा के लिए सत्य लौटता है)।
इसके अलावा, सर्वांगसमता रखने के लिए, आप एक Collection
एक और संग्रह के सभी तत्वों को जोड़ सकते हैं लगता है कि सकता है, लेकिन, एक Iterable
जरूरी एक संग्रह नहीं है (यह कुछ भी, उदाहरण के लिए एक ResultSet
आवरण की तरह हो सकता है)।
आह, आपका पहला बिंदु एक अच्छा है। मैं वास्तव में समझ नहीं पा रहा हूं कि आप दूसरे के द्वारा क्या मतलब रखते हैं और यह 'addAll' विधि को कैसे प्रभावित करेगा। – Albert
दूसरे के लिए, एक पुनरावर्तनीय एक इंटरफ़ेस है, बहुत कुछ, कुछ भी इसे कार्यान्वित कर सकता है, और आप संभावित अनंत लूप के साथ पहली स्थिति में समाप्त हो सकते हैं। – OscarRyz
यकीन नहीं है कि मैं सहमत हूं। एक संग्रह इटरटेबल के समान ही अनंत हो सकता है, क्योंकि आप एक इटेबल के चारों ओर एक रैपर के रूप में एक वैध संग्रह बना सकते हैं। – GaryF
कोर जेडीके में कुछ चीजें हैं जो सादे Iterables के साथ-साथ काम नहीं कर सकती हैं। मैं इन कमियों को दूर करने के लिए Guava का उपयोग करने की सलाह दूंगा।
हाय, क्या आप जल्द ही इनमें से कुछ कमियों को सूचीबद्ध कर सकते हैं? – ctomek
@ctomek: यह वास्तव में गुवा द्वारा उपलब्ध कराई गई सूची की एक सूची होगी, जो कि लिंक का पालन करके दिखाया गया है और यह क्या देख रहा है ... –
संदेह होने पर, हमेशा अमरूद (या कॉमन्स) की जाँच करें:
+1 के लिए +1 जब संदेह होता है, तो हमेशा गुवा * की जांच करें। अधिकांश अपाचे कॉमन्स libs बहुत अच्छे हैं, लेकिन कॉमन्स/संग्रह परेशान है क्योंकि यह जेनेरिक का समर्थन नहीं करता है। –
इसमें एक कांटा है जो जेनेरिक का समर्थन करता है: https://github.com/megamattron/collections-generic – thSoft
दूसरों का जवाब दे दिया "क्यों" बड़े पैमाने पर।
Iterables के लिए ऐसा करने के लिए कोई भी समान विधि?
जावा 8 में आप addAll
किसी भी अधिक की जरूरत नहीं है:
Collection<X> coll = ...;
Iterable<X> it = ...;
it.forEach(coll::add); // coll.addAll(it);
यह वही है जो मैं ढूंढ रहा था। पता था कि यह सिर्फ जेडीके के साथ संभव था। धन्यवाद! – Michael
आप देख रहे हैं एक स्पष्ट पाश के बिना एक संग्रह करने के लिए एक इटरेटर को जोड़ने के लिए सबसे आसान तरीका है के लिए, आप yourCollection इस्तेमाल कर सकते हैं '। addAll (org.apache.commons.collections.IteratorUtils.toList (yourIterable.iterator())) – mihi
और यदि आपका इटेरबल एक सरणी है, तो 'java.util.Arrays.asList() ' – mihi
का उपयोग करें Arrays' Iterable' –