Operare su e rimuovere un elemento dal flusso

1. Panoramica

In questo rapido tutorial, impareremo i vari modi in cui possiamo operare su un elemento in uno stream Java 8 e quindi rimuoverlo una volta completata l'operazione.

2. Configurazione

Definiamo prima il nostro oggetto Item . Questo è un oggetto semplice con un singolo campo int .

Ha un metodo che determina se l'oggetto è qualificato per il funzionamento, in base al valore interno:

class Item { private int value; // constructors public boolean isQualified() { return value % 2 == 0; } public void operate() { System.out.println("Even Number"); } }

Ora possiamo creare una sorgente per il nostro flusso che può essere una raccolta di elementi:

List itemList = new ArrayList(); for (int i = 0; i < 10; i++) { itemList.add(new Item(i)); }

3. Filtraggio degli elementi

In molti casi, se vogliamo fare qualcosa con un sottoinsieme di elementi, possiamo usare il metodo di filtro Stream # e non dobbiamo prima rimuovere nulla:

itemList.stream() .filter(item -> item.isQualified()) ...

4. Utilizzo e rimozione di un oggetto

4.1. Collection.removeIf

Possiamo usare Streams per iterare e operare sulla raccolta di elementi .

Utilizzando Streams , possiamo applicare funzioni lambda note come Predicates . Per saperne di più su stream e predicati , abbiamo un altro articolo qui.

Possiamo creare un predicato che determinerebbe se un oggetto è idoneo per essere operato:

Predicate isQualified = item -> item.isQualified();

Il nostro predicato filtrerà gli elementi su cui vogliamo operare:

itemList.stream() .filter(isQualified) .forEach(item -> item.operate());

Una volta che abbiamo finito di operare sugli elementi nello stream, possiamo rimuoverli utilizzando lo stesso Predicate che abbiamo usato in precedenza per il filtraggio:

itemList.removeIf(isQualified);

Internamente, removeIf utilizza un iteratore per iterare l'elenco e abbinare gli elementi utilizzando il predicato. Ora possiamo rimuovere qualsiasi elemento corrispondente dall'elenco.

4.2. Collection.removeAll

Possiamo anche usare un altro elenco per contenere gli elementi su cui si è operato e quindi rimuoverli dall'elenco originale:

List operatedList = new ArrayList(); itemList.stream() .filter(item -> item.isQualified()) .forEach(item -> { item.operate(); operatedList.add(item); }); itemList.removeAll(operatedList);

A differenza di removeIf che utilizza un Iterator, removeAll utilizza un semplice ciclo for per rimuovere tutti gli elementi corrispondenti nell'elenco.

5. conclusione

In questo articolo, abbiamo esaminato un modo per operare su un elemento in Java 8 Streams e quindi rimuoverlo. Abbiamo anche visto un modo per farlo utilizzando un elenco aggiuntivo e rimuovendo tutti gli elementi corrispondenti.

Il codice sorgente di questo tutorial e i casi di test pertinenti sono disponibili su GitHub.