2010-09-30 12 views
36

मुझे आश्चर्य है कि Collection.addAll() विधि केवल Collection एस स्वीकार करती है लेकिन Iterable एस नहीं। ऐसा क्यों है?जावा: क्यों संग्रह.addAll Iterables स्वीकार नहीं कर सकता है?

Iterable एस के लिए ऐसा करने के लिए कोई भी समान विधि?

+0

आप देख रहे हैं एक स्पष्ट पाश के बिना एक संग्रह करने के लिए एक इटरेटर को जोड़ने के लिए सबसे आसान तरीका है के लिए, आप yourCollection इस्तेमाल कर सकते हैं '। addAll (org.apache.commons.collections.IteratorUtils.toList (yourIterable.iterator())) – mihi

+1

और यदि आपका इटेरबल एक सरणी है, तो 'java.util.Arrays.asList() ' – mihi

+0

का उपयोग करें Arrays' Iterable' –

उत्तर

35

संभवतः Collection इंटरफ़ेस जावा 1.2 में पेश किया गया था जबकि Iterable केवल 1.5 में दिखाई दिया था, और इंटरफ़ेस बदलने से सभी मौजूदा कार्यान्वयन टूट जाएंगे।

+0

दोह !!! ... आप सही हैं, मैं क्या सोच रहा था। .... हटा रहा है ... और प्लस ऑनिंग – OscarRyz

+2

यह स्पष्ट नहीं करता है कि विधि को बाद में क्यों जोड़ा नहीं गया था। – user48956

+0

@ user48956: हाँ, यह करता है: "इंटरफ़ेस बदलना सभी मौजूदा कार्यान्वयन को तोड़ देगा"। हालांकि यह वास्तव में जावा 8 में डिफ़ॉल्ट विधियों के परिचय के साथ असत्य हो गया। –

10

असल में क्योंकि Iterable कभी खत्म नहीं हो सकता है (यानी, hasNext() हमेशा के लिए सत्य लौटता है)।

इसके अलावा, सर्वांगसमता रखने के लिए, आप एक Collection एक और संग्रह के सभी तत्वों को जोड़ सकते हैं लगता है कि सकता है, लेकिन, एक Iterable जरूरी एक संग्रह नहीं है (यह कुछ भी, उदाहरण के लिए एक ResultSet आवरण की तरह हो सकता है)।

+0

आह, आपका पहला बिंदु एक अच्छा है। मैं वास्तव में समझ नहीं पा रहा हूं कि आप दूसरे के द्वारा क्या मतलब रखते हैं और यह 'addAll' विधि को कैसे प्रभावित करेगा। – Albert

+0

दूसरे के लिए, एक पुनरावर्तनीय एक इंटरफ़ेस है, बहुत कुछ, कुछ भी इसे कार्यान्वित कर सकता है, और आप संभावित अनंत लूप के साथ पहली स्थिति में समाप्त हो सकते हैं। – OscarRyz

+6

यकीन नहीं है कि मैं सहमत हूं। एक संग्रह इटरटेबल के समान ही अनंत हो सकता है, क्योंकि आप एक इटेबल के चारों ओर एक रैपर के रूप में एक वैध संग्रह बना सकते हैं। – GaryF

4

कोर जेडीके में कुछ चीजें हैं जो सादे Iterables के साथ-साथ काम नहीं कर सकती हैं। मैं इन कमियों को दूर करने के लिए Guava का उपयोग करने की सलाह दूंगा।

+0

हाय, क्या आप जल्द ही इनमें से कुछ कमियों को सूचीबद्ध कर सकते हैं? – ctomek

+0

@ctomek: यह वास्तव में गुवा द्वारा उपलब्ध कराई गई सूची की एक सूची होगी, जो कि लिंक का पालन करके दिखाया गया है और यह क्या देख रहा है ... –

30

संदेह होने पर, हमेशा अमरूद (या कॉमन्स) की जाँच करें:

+5

+1 के लिए +1 जब संदेह होता है, तो हमेशा गुवा * की जांच करें। अधिकांश अपाचे कॉमन्स libs बहुत अच्छे हैं, लेकिन कॉमन्स/संग्रह परेशान है क्योंकि यह जेनेरिक का समर्थन नहीं करता है। –

+0

इसमें एक कांटा है जो जेनेरिक का समर्थन करता है: https://github.com/megamattron/collections-generic – thSoft

6

दूसरों का जवाब दे दिया "क्यों" बड़े पैमाने पर।

Iterables के लिए ऐसा करने के लिए कोई भी समान विधि?

जावा 8 में आप addAll किसी भी अधिक की जरूरत नहीं है:

Collection<X> coll = ...; 
Iterable<X> it = ...; 
it.forEach(coll::add); // coll.addAll(it); 
+0

यह वही है जो मैं ढूंढ रहा था। पता था कि यह सिर्फ जेडीके के साथ संभव था। धन्यवाद! – Michael

संबंधित मुद्दे