2016-02-19 10 views
9

मुझे ऐसे दृष्टिकोण की पहचान करने में रूचि है जो तत्वों की सूची किसी अन्य सूची में छोड़कर तत्वों को छोड़ देता है।जावा 8 स्ट्रीम। सभी तत्वों के अलावा अन्य तत्व

उदाहरण

List<Integer> multiplesOfThree = ... // 3,6,9,12 etc 
List<Integer> evens = ... // 2,4,6,8 etc 
List<Integer> others = multiplesOfThree.except(evens) // should return a list of elements that are not in the other list 

तुम ऐसा कैसे करते हो के लिए

? मैं एक दृष्टिकोण है कि एक सा भद्दा और पढ़ने के लिए मुश्किल है ....

multiplesOfThree.stream() 
.filter(intval -> evens.stream().noneMatch(even -> even.intValue() == intval.intValue())) 

उत्तर

12

आप Stream's filter method उपयोग कर सकते हैं मिल गया है, एक Predicate सुनिश्चित करता है कि तत्व evens में मौजूद नहीं है गुजर।

List<Integer> others = multiplesOfThree.stream() 
     .filter(i -> !evens.contains(i)) 
     .collect(Collectors.toList()); 

लेकिन यह सोचते हैं आप एक परिवर्तनशील List (जैसे ArrayList) है, तो आप भी, नदियों की जरूरत नहीं है बस Collections's removeAll method

multiplesOfThree.removeAll(evens); 
+0

हटाएं सभी एक उत्कृष्ट समाधान है। –

5

आप इस्तेमाल कर सकते हैं

multipleOfThree.stream() 
       .filter(((Predicate<Integer>) evens::contains).negate()) 

या बड़े even सूचियों

HashSet<Integer> evenSet = new HashSet<>(even); 
multipleOfThree.stream() 
       .filter(((Predicate<Integer>) evenSet::contains).negate()) 
1

कुछ समाधान कर रहे हैं के लिए और अधिक कुशल।

पहले, धाराओं का उपयोग किए बिना, आप बस एक नई सूची बनाने और इसे से एक और संग्रह से सभी तत्वों को दूर कर सकते हैं ...

final List<Integer> multiplesOfThree = Arrays.asList(3,6,9,12); 
final List<Integer> evens = Arrays.asList(2,4,6,8,10,12); 
final List<Integer> others1 = new ArrayList<>(multiplesOfThree); 
others1.removeAll(evens); 

एक अन्य समाधान() एक फिल्टर के माध्यम से पारित करने के लिए धारा होगा:

final List<Integer> others2 = multiplesOfThree 
    .stream() 
    .filter(x -> !evens.contains(x)) 
    .collect(Collectors.toList()); 

(आप evens इस मामले में एक Set बनाने पर विचार कर सकते)।

और आखिरकार, आप उपरोक्त तर्क को "यहां तक ​​कि" सभी कार्यों के संग्रह के बजाय एक समारोह के रूप में प्रस्तुत करने के लिए संशोधित कर सकते हैं। यह अनिवार्य रूप से उपरोक्त जैसा ही है, लेकिन आपके पास दूसरा संग्रह नहीं है।

final List<Integer> others3 = multiplesOfThree 
    .stream() 
    .filter(x -> x % 2 != 0) 
    .collect(Collectors.toList()); 
संबंधित मुद्दे