2017-09-16 1 views
1
HashSet<Integer> liczby = new HashSet<Integer>(); 
liczby.add(1); 
liczby.add(2); 
liczby.add(3); 
liczby.add(4); 
liczby.removeIf ((Integer any) -> { return liczby.contains(3); }); 

for(Iterator<Integer> it = liczby.iterator(); it.hasNext();){ 
    Integer l2 = it.next(); 
    System.out.println(l2); 
} 

Ich kann nicht verstehen, warum removeif löscht nicht nur drei, sondern auch 1 und 2 Bedingung erfüllt nur 3 ...lambdas in removeif

+0

Ich schlage vor, nur eine Sprache in Ihren Programmen zu verwenden - Englisch. Durch das Mischen von Sprache wird der Code für andere Peers schwerer lesbar, wenn sie Polnisch nicht beherrschen - und sie müssen es nicht. – DevDio

Antwort

3

Die Lambda auf jedes Element angewendet wird, und prüfen Sie, ob 3 vorhanden ist, wenn ja, es wird das Element löschen:

1 -> 3 is present -> delete 1 
2 -> 3 is present -> delete 2 
3 -> 3 is present -> delete 3 
4 -> 3 is not present -> don't delete 4 

Um alle 3 Element zu entfernen, werden Sie eine dieser Lösungen verwenden können:

liczby.removeIf(any -> any.equals(3)); 
//------------------------------------------------- 
liczby.removeIf(new Integer(3)::equals); 
//------------------------------------------------- 
Integer toRemove = 3; 
liczby.removeIf(toRemove::equals); 


TIPS

Ihr Lambda kann vereinfacht werden:

liczby.removeIf(any -> liczby.contains(3)); 

foreach-Schleife könnte einfacher sein, für einfache Iteration zu verwenden:

for(Integer i : liczby){ 
    System.out.println(i); 
} 
+2

* weil es primitiv ist * nein ist es nicht. :) – nullpointer

+0

oder verwenden Sie einfach 'liczby.remove (3);' – Holger

5

Betrachten Sie es auf diese Weise ... so lang sein sollte wie Das Set enthält 3 es wird weiterhin das aktuelle Ergebnis entfernen.

Wenn Sie die 3 nur entfernen wollen, dann tun:

liczby.removeIf(e -> e == 3); 
+3

könnte man auch eine Methodenreferenz machen: 'Integer interested = 3; liczby.removeIf (interessiert :: gleich); ' – Eugene