2015-08-01 6 views
9

मैं एक नई सूची के बिना एक साधारण लैम्ब्डा Predicate, के साथ जावा -8 में एक सूची फ़िल्टर करने का सबसे साफ तरीका ढूंढ रहा हूं।जावा -8 एक नई सूची बनाने के बिना एक सूची फ़िल्टर करें

विशेष रूप से, इस समस्या का समाधान नहीं उपयुक्त, के रूप में toList() रिटर्न एक नया List है:

List<Person> beerDrinkers = persons.stream() 
    .filter(p -> p.getAge() > 16) 
    .collect(Collectors.toList()); 

ध्यान दें कि निम्नलिखित समाधान या तो काम नहीं करता, क्योंकि सूची अपने मूल मूल्यों के clear() एड होना चाहिए (लेकिन जाहिर है, अगर आप स्पष्ट यह छानने से पहले, वहाँ कुछ भी नहीं है फिल्टर करने के लिए छोड़ दिया है ...):

persons.stream() 
    .filter(p -> p.getAge() > 16) 
    .forEach((p) -> persons.add(p)); 

(इसके अलावा, मैं टी को शामिल नहीं एक समाधान पसंद करते हैं वह एक तृतीय पक्ष पुस्तकालय या ढांचे का उपयोग करता है)

+0

अच्छा चर नाम। : पी –

+0

https://github.com/wapatesh/fig देखें, आपको कई मामलों में इसकी आवश्यकता हो सकती है – Stoneboy

उत्तर

15
beerDrinkers.removeIf(p -> p.getAge() <= 16); 
+0

बिल्कुल सही! मैंने इस नई विधि को नहीं देखा था! –

+1

एक ओर ध्यान दें: यह एक द्विघात asymptotic प्रसारण समय (सूची के प्रकार पर निर्भर करता है) हो सकता है, जबकि छानने और संग्रह हमेशा हे (एन) – Marco13

+1

हो जाएगा @ Marco13 यह होगा ArrayList के साथ है और न ही LinkedList, जिसके द्वारा कर रहे हैं के साथ नहीं हालांकि, सबसे अधिक इस्तेमाल की जाने वाली सूचियां। क्या आपके मन में एक विशिष्ट सूची कार्यान्वयन है? –

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