Intersezione di due elenchi in Java

1. Panoramica

In questo tutorial impareremo come recuperare l'intersezione di due List .

Come molte altre cose, questo è diventato molto più semplice grazie all'introduzione dei flussi in Java 8.

2. Intersezione di due elenchi di stringhe

Creiamo due liste di stringhe con qualche intersezione, entrambe con alcuni elementi duplicati:

List list = Arrays.asList("red", "blue", "blue", "green", "red"); List otherList = Arrays.asList("red", "green", "green", "yellow");

E ora determineremo l'intersezione degli elenchi con l'aiuto dei metodi di flusso :

Set result = list.stream() .distinct() .filter(otherList::contains) .collect(Collectors.toSet()); Set commonElements = new HashSet(Arrays.asList("red", "green")); Assert.assertEquals(commonElements, result);

Per prima cosa, rimuoviamo gli elementi duplicati con distinti . Quindi, usiamo il filtro per selezionare gli elementi che sono contenuti anche in otherList .

Infine, convertiamo il nostro output con un Collector . L'intersezione dovrebbe contenere ogni elemento comune solo una volta. L'ordine non dovrebbe avere importanza, quindi toSet è la scelta più semplice, ma possiamo anche usare toList o un altro metodo di raccolta.

Per maggiori dettagli, consulta la nostra guida ai collezionisti di Java 8.

3. Intersezione di elenchi di classi personalizzate

Cosa succede se le nostre liste non contengono stringhe ma piuttosto istanze di una classe personalizzata che abbiamo creato? Bene, fintanto che seguiamo le convenzioni di Java, la soluzione con i metodi di flusso funzionerà bene per la nostra classe personalizzata.

In che modo il metodo contiene decide se un oggetto specifico appare in un elenco? Basato sul metodo uguale . Pertanto, dobbiamo sovrascrivere il metodo uguale e assicurarci che confronti due oggetti in base ai valori delle proprietà pertinenti.

Ad esempio, due rettangoli sono uguali se la larghezza e l'altezza sono uguali.

Se non sovrascriviamo il metodo equals , la nostra classe utilizza l' implementazione equals della classe genitore. Alla fine della giornata, o meglio, la catena di ereditarietà, viene eseguito il metodo equals della classe Object . Quindi due istanze sono uguali solo se si riferiscono esattamente allo stesso oggetto nell'heap.

Per ulteriori informazioni sul metodo equals , consulta il nostro articolo sui contratti Java equals () e hashCode () .

4. Conclusione

In questo rapido articolo, abbiamo visto come utilizzare i flussi per calcolare l'intersezione di due elenchi. Ci sono molte altre operazioni che erano piuttosto noiose ma sono piuttosto semplici se sappiamo come aggirare l'API Java Stream. Dai un'occhiata ai nostri ulteriori tutorial con i flussi Java qui.

Esempi di codice sono disponibili su GitHub.