2015-08-01 11 views
9

Poszukuję najczystszego sposobu filtrowania listy w języku Java-8, za pomocą prostej wartości lambda Predicate, bez tworzenia nowej listy.java-8 filtruj listę bez tworzenia nowej listy

W szczególności, rozwiązanie to nie nadaje się, jako toList() zwraca nowy List:

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

pamiętać, że poniższe rozwiązanie nie działa albo, ponieważ lista powinna być clear() ed swoich pierwotnych wartości (ale oczywiście, jeśli oczywiste jest przed filtrowania, nie ma nic do filtrowania ...):

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

(też wolałbym rozwiązanie nie obejmujące t korzysta z biblioteki lub architektury innej firmy)

+0

Przyjemna nazwa zmiennej. : P –

+0

Sprawdź https://github.com/wapatesh/fig, może być potrzebny w wielu przypadkach – Stoneboy

Odpowiedz

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

Perfect! Nie zauważyłem tej nowej metody! –

+1

Notatka boczna: Może to mieć kwadratowy asymptotyczny czas działania (w zależności od typu listy), podczas gdy filtrowanie i zbieranie zawsze będzie O (n) – Marco13

+1

@ Marco13 Nie będzie z ArrayList ani z LinkedList, które są przez jednak najczęściej używane listy. Czy masz na myśli konkretną implementację List? –

Powiązane problemy