2016-06-09 6 views
1
class A { 
    List<B> b; 
} 

class B{ 
    boolean flag; 

    B(boolean flag) { 
     this.flag = flag; 
    } 
    //getter setter 
} 

B b1 = new B(true); 
B b2 = new B(true); 
B b3 = new B(false); 

List<B> list1 = new ArrayList<>(); 
list1.add(b1); 
list1.add(b2); 
list1.add(b3); 

Set<A> a = new HashSet<>(); 
a.add(list1); 

gibt die Liste verwenden, um einen Satz von Objekt A.Wie Java 8 Stream-API für die Filter innerhalb eines Satzes

Objekt A eine Liste von Objekt B B enthält, hat einen Booleschen Eigenschaftsnamen ‚flag‘ Verwenden Sie Java 8 Streams API, wie Sie die obige Gruppe so filtern, dass sie die Liste von B mit booleschem Flag nur als wahr enthält. , d. H. B3 sollte aus Liste1 entfernt werden. Um es einfach zu halten, nur den einzelnen Wert hinzugefügt.

Antwort

3

Sie haben eine Klasse A, die eine Liste von B enthält; Das Ziel ist, in jedem A alle B zu entfernen, die einer Bedingung entsprechen.

Die erste Lösung ist einen Strom des Satzes von A s machen und jeden von ihnen zu einem neuen A Karte, wo die Liste der B filtriert. Unter der Annahme, dass es einen Konstruktor ist A(List<B> b) und die entsprechenden Getter (List<B> getB() in Klasse A; boolean isFlag() in Klasse B), könnten Sie haben:

Set<A> set = new HashSet<>(); 

Set<A> filtered = 
    set.stream() 
     .map(a -> new A(a.getB().stream().filter(B::isFlag).collect(Collectors.toList()))) 
     .collect(Collectors.toSet()); 

Eine zweite Lösung möglich ist, wenn Sie die Liste der B s Ein- ändern platzieren, anstatt einen neuen zu erstellen. In einem solchen Fall könnten Sie haben:

set.forEach(a -> a.getB().removeIf(b -> !b.isFlag())); 

die alle B zu entfernen, wo das Flag false für jede A ist.

1
@org.junit.Test 
    public void test() { 
     B b1 = new B(true); 
     B b2 = new B(true); 
     B b3 = new B(false); 

     List<B> list1 = new ArrayList(); 
     list1.add(b1); 
     list1.add(b2); 
     list1.add(b3); 

     Set<A> a = new HashSet(); 
     a.add(new A(list1)); 

     a.stream().forEach(aa -> aa.setB(aa.getB().stream().filter(B::isFlag).collect(Collectors.toList()))); 

     System.out.println(a); 
    } 

Ausgang:

[A{b=[B{flag=true}, B{flag=true}]}] 
+0

Während dieser Code-Schnipsel, die Frage lösen kann, [einschließlich einer Erklärung] (https://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) hilft wirklich, die zur Verbesserung der Qualität Ihres Beitrags. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. Bitte versuchen Sie auch nicht, Ihren Code mit erklärenden Kommentaren zu füllen, dies verringert die Lesbarkeit sowohl des Codes als auch der Erklärungen! –

+0

Ok, ich werde mich daran erinnern und versprechen, zu verbessern :) – Mateusz

0
a.stream().forEach(l -> l.removeIf(b -> !b.getFlag())); 
+1

Obwohl dieser Code die Frage beantworten kann, bietet zusätzlichen Kontext in Bezug auf _why_ und/oder _how_ es Antworten die Frage würde deutlich verbessern seine langfristige Wert. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erklärung hinzuzufügen. –

Verwandte Themen