2012-05-31 13 views
17

अगर Iterables.filter(Iterable, Predicate) और Collections2.filter(Collection, Predicate) विधियों के बीच कोई अंतर है तो मैं गुवा में जानना चाहता हूं?अमरूद: Iterables.filter वीएस संग्रह 2.फिल्टर, कोई बड़ा अंतर?

वे दोनों पुनरावृत्ति आदेश बनाए रखने और लाइव व्यू प्रदान करने के लिए प्रतीत होते हैं। जावाडोक कहते हैं कि Collections2.filter().size() कॉलिंग सभी तत्वों पर फिर से शुरू हो जाएगी।

मान लीजिए कि मेरे पास वस्तुओं की एक सूची फ़िल्टर करने का अनुमान है, और नतीजतन मैं दृश्य में छोड़ी गई वस्तुओं की संख्या (या सूची, कोई फर्क नहीं पड़ता) चाहता हूं। मुझे क्या उपयोग करना चाहिए? Collections2.filter का उपयोग करना आसान लगता है क्योंकि size() विधि Collection एस द्वारा प्रदान की जाती है।

ImmutableList.copyOf(
    Iterables.filter(lead.getActions(), isRealActionDoneByUserPredicate) 
).size(); 

और::

लेकिन पृष्ठभूमि में, वहाँ के बीच एक अंतर है

Collections2.filter(lead.getActions(),isRealActionDoneByUserPredicate).size(); 

वैसे, एक सामान्य ArrayList निर्माण की तुलना में एक ImmutableList तेजी से बनाने जा रहा है?

+0

बस स्पष्ट रूप से स्पष्ट बताते हुए: कोई आपको 'Iterable' देता है और दूसरा आपको' संग्रह 'देता है। 'संग्रह 2.फिल्टर' के नीचे 'फ़िल्टर किए गए चयन' का उपयोग करता है [लिंक] (https://code.google.com/p/guava-libraries/source/browse/guava/src/com/google/common/collect/Collections2.java# 133) जो कई चीजों को 'Iterables'/'Iterators' को प्रस्तुत करता है, इसलिए कोई कार्यात्मक मतभेद नहीं होना चाहिए। उदाहरण के लिए 'फ़िल्टर किए गए कोलेक्शन # आकार() 'बिल्कुल' Iterators.size (Iterators.filter (unfiltered.iterator(), predicate) है) के रूप में @Louis Wasserman का जवाब इंगित करता है। –

उत्तर

22

यहां गुवा योगदानकर्ता।

Collections2.filter(elements, predicate).size() 

बेहतर है, के रूप में यह कोई नकल करता है - लेकिन

Iterables.size(Iterables.filter(elements, predicate)) 

अनिवार्य रूप से बराबर है, और इसी तरह किसी भी नकल के बिना जवाब मिल जाएगा - दोनों filter तरीकों एक दृश्य वापस जाएँ।

  • ImmutableList.copyOf(collection) समय के लगभग ठीक उसी उसका ध्यान रखना चाहिए:

    बनाम एक ImmutableList एक ArrayList के निर्माण की सापेक्ष गति का सवाल है, यह जो निर्माण विधि द्वारा आप उपयोग भिन्न होता है। (इसे नल की जांच करनी है, लेकिन यह सस्ता है।)

  • ImmutableList.builder()....build() एक छोटा स्थिर कारक लंबा लेता है, क्योंकि इसे Builder के अंदर उपयोग करना है, क्योंकि हम पहले से नहीं जानते कि कितने तत्व जोड़े जाएंगे।
  • ImmutableList.of(...) के बराबर गति होगी।

जिसके अनुसार, वैचारिकImmutableList उपयोग कर के लाभ अक्सर छोटे प्रदर्शन लागत पल्ला झुकना, खासकर यदि आप सूचियों गुजर रहे होंगे अक्सर चारों ओर।

+0

धन्यवाद। मुझे लगता है कि आपका मतलब Iterables.size() मुझे कोई Iterables नहीं मिलता है। लम्बाई() –

+0

हां, मेरा बुरा। फिक्स्ड। –

+0

स्पर्शरेखा लेकिन तुम लोग() 'Builder'sa निर्माता कि' पूर्णांक expectedSize' लेता देने और इसी 'बिल्डर (पूर्णांक उजागर' तरीकों पर विचार किया? या वहां एपीआई में जोड़ा शोर के लिए बहुत कम लाभ हो सकता है? –

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