2015-08-01 12 views
9

Sto cercando il modo più pulito per filtrare un elenco in Java-8, con un semplice lambda Predicate, senza creare un nuovo elenco.java-8 filtra un elenco senza creare un nuovo elenco

In particolare, questa soluzione non è adatta, come toList() restituisce un nuovo List:

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

Si noti che la seguente soluzione non funziona neanche, perché l'elenco dovrebbe essere clear() ed i suoi valori originali (ma ovviamente, se si cancella lo prima filtraggio, non c'è niente da filtrare ...):

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

(Inoltre, preferirei una soluzione non prevedono t egli usa una libreria o un framework di terze parti)

+0

Nome variabile di Nizza. : P –

+0

Controlla https://github.com/wapatesh/fig, potresti averne bisogno in molti casi – Stoneboy

risposta

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

Perfetto! Non avevo notato questo nuovo metodo! –

+1

Una nota a margine: può avere un tempo di esecuzione asintotico quadratico (a seconda del tipo dell'elenco), mentre il filtro e la raccolta saranno sempre O (n) – Marco13

+1

@ Marco13 Non sarà con ArrayList né con LinkedList, che sono di lontano dagli elenchi più comunemente usati, comunque. Hai in mente una specifica implementazione di List? –

Problemi correlati