2011-05-30 15 views
6

मान लें कि आप ImmutableSet/List/Map ऑब्जेक्ट की एक प्रति बनाना चाहते हैं लेकिन कुछ मूल प्रविष्टियों को फ़िल्टर करें। कि लागू करने के लिए एक तरह से निम्नलिखित है:Google संग्रह (गुवा पुस्तकालय): अपरिवर्तनीय सेट/सूची/मानचित्र और फ़िल्टरिंग

ImmutableList.copyOf(Iterables.filter(myObject, myObject.EQUALS)); 

जहां myObject.EQUALSIterables.filter() ऑपरेशन के लिए एक विधेय है। मुझे लगता है कि यह एक सुंदर सुरुचिपूर्ण और आसानी से पढ़ा जाने वाला कार्यान्वयन है। हालांकि, एक दो सूची वस्तुओं का निर्माण करता है (पहले Iterables.filter(...) कॉल के माध्यम से, दूसरा ImmutableList.copyOf(...) के माध्यम से) जो बहुत अक्षम है।

क्या कोई इसे करने के लिए एक और अधिक प्रभावी तरीका जानता है?

मुझे लगता है कि सबसे अच्छी बात ImmutableSet/List/Map बिल्डरों के लिए फिल्टर विधेय जोड़ने के लिए इतना है कि वस्तु केवल एक बार का निर्माण किया जाना चाहिए होगा। लेकिन दुर्भाग्य से ऐसा कोई पैरामीटर नहीं है। अमरूद के Iterators

विशेष रूप से फिल्टर (इटरेटर फ़िल्टर नहीं किए गए, विधेय विधेय) पर

+1

द्वारा प्रदान की इटरेटर शायद आप Predicates.equalTo() के बजाय यह लागू करने के लिए उपयोग कर सकते :) –

+0

संकेत ;-) – danbim

उत्तर

0

देखो

+1

खैर हाँ, कि 'Iterables द्वारा आंतरिक रूप से प्रयोग किया जाता है के लिए धन्यवाद .filter() ':-) –

+0

हाँ। तुम सही हो। बस इसे देखा। यदि संदेह में मैं हमेशा इटरेटर्स का उपयोग करता हूं लेकिन यह जानना अच्छा होता है (देखें)। –

16

Iterables.filter() का परिणाम myObject में डेटा पर सिर्फ एक दृश्य है: नई सूची केवल छानने का उपयोग कर ImmutableList.copyOf() द्वारा बनाया गया है Iterable

+6

+1: यह कम ज्ञात और अक्सर देखा जाता है: 'फ़िल्टर()' ** ** ** एक प्रतिलिपि नहीं बनाते (सभी संबंधित फायदे और नुकसान के साथ), यह सिर्फ एक दृश्य है। –

+1

Iterables.transform() –

+0

ग्रेट के लिए यह वही बात है! जानकारी के लिए धन्यवाद! – danbim

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