Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Eliminazione dei Duplicati con il Metodo distinct() | Operazioni Intermedie Nello Stream API
Stream API

bookEliminazione dei Duplicati con il Metodo distinct()

Nel contesto dello sviluppo reale, si presentano spesso situazioni in cui i dati contengono duplicati che devono essere rimossi. Ad esempio, si può compilare un elenco di partecipanti a una conferenza, ma a causa di errori di sistema, alcuni nomi potrebbero essere stati registrati due volte.

Il metodo distinct() consente di risolvere questo problema eliminando gli elementi duplicati da uno stream.

Stream<T> distinct()

Questo metodo restituisce uno stream contenente solo elementi unici, filtrando eventuali duplicati.

Come Funziona

Il metodo distinct() si basa su hashCode() per rilevare rapidamente potenziali duplicati e su equals() per confermare se sono realmente identici. Se due oggetti hanno hash code diversi, sono considerati unici. Se gli hash code coincidono, viene chiamato equals() per verificare la loro uguaglianza in base a criteri specifici.

Insieme, questi metodi costituiscono hashCode() e equals() contratto, garantendo una corretta comparazione e rimozione dei duplicati.

Invece di scriverli manualmente, IntelliJ IDEA consente di generarli automaticamente.

In IntelliJ IDEA, è stato aperto il menu di generazione del codice (Alt + Insert su Windows/Linux, Cmd + N su Mac) e sono stati selezionati equals() e hashCode(). Dopo aver scelto i campi da includere nel confronto, IDEA ha generato automaticamente i metodi necessari.

Esempio pratico

Una fabbrica tiene traccia dei pezzi prodotti, ma il rapporto contiene duplicati così come pezzi difettosi etichettati come DEFECT. L'obiettivo è ripulire l'elenco, mantenendo solo i pezzi unici e non difettosi, ordinarli per nome e visualizzarli nel formato: Name - Serial Number.

Main.java

Main.java

copy
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
package com.example; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Part> parts = List.of( new Part("SN001", "Gear"), new Part("SN002", "Bolt"), new Part("SN003", "Nut"), new Part("SN001", "Gear"), new Part("SN004", "DEFECT Shaft"), new Part("SN005", "Screw"), new Part("SN002", "Bolt"), new Part("SN006", "DEFECT Washer") ); List<String> processedParts = parts.stream() .distinct() .filter(part -> !part.getName().contains("DEFECT")) .sorted((p1, p2) -> p1.getName().compareToIgnoreCase(p2.getName())) .map(part -> part.getName() + " - " + part.getSerialNumber()) .toList(); System.out.println(processedParts); } } class Part { private String serialNumber; private String name; public Part(String serialNumber, String name) { this.serialNumber = serialNumber; this.name = name; } public String getSerialNumber() { return serialNumber; } public String getName() { return name; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Part)) return false; Part part = (Part) o; return serialNumber.equals(part.serialNumber); } @Override public int hashCode() { return serialNumber.hashCode(); } @Override public String toString() { return name + " - " + serialNumber; } }

Per rimuovere i duplicati e filtrare i pezzi difettosi, i metodi equals() e hashCode() devono essere implementati correttamente per confrontare i pezzi tramite il numero di serie.

Successivamente, si utilizza distinct() per eliminare i duplicati, filter() per rimuovere i pezzi difettosi che contengono DEFECT nel nome, sorted() per ordinare i pezzi rimanenti e map() per formattarli come stringhe.

1. Cosa viene utilizzato per confrontare gli elementi nel metodo distinct()?

2. Se due oggetti hanno lo stesso hashCode(), ma il loro metodo equals() restituisce false, saranno considerati uguali nel metodo distinct()?

question mark

Cosa viene utilizzato per confrontare gli elementi nel metodo distinct()?

Select the correct answer

question mark

Se due oggetti hanno lo stesso hashCode(), ma il loro metodo equals() restituisce false, saranno considerati uguali nel metodo distinct()?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 2. Capitolo 7

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Suggested prompts:

Can you show me a code example of how to use distinct() in this scenario?

How do I implement equals() and hashCode() for my Part class?

What does the full stream pipeline look like for this example?

Awesome!

Completion rate improved to 2.33

bookEliminazione dei Duplicati con il Metodo distinct()

Scorri per mostrare il menu

Nel contesto dello sviluppo reale, si presentano spesso situazioni in cui i dati contengono duplicati che devono essere rimossi. Ad esempio, si può compilare un elenco di partecipanti a una conferenza, ma a causa di errori di sistema, alcuni nomi potrebbero essere stati registrati due volte.

Il metodo distinct() consente di risolvere questo problema eliminando gli elementi duplicati da uno stream.

Stream<T> distinct()

Questo metodo restituisce uno stream contenente solo elementi unici, filtrando eventuali duplicati.

Come Funziona

Il metodo distinct() si basa su hashCode() per rilevare rapidamente potenziali duplicati e su equals() per confermare se sono realmente identici. Se due oggetti hanno hash code diversi, sono considerati unici. Se gli hash code coincidono, viene chiamato equals() per verificare la loro uguaglianza in base a criteri specifici.

Insieme, questi metodi costituiscono hashCode() e equals() contratto, garantendo una corretta comparazione e rimozione dei duplicati.

Invece di scriverli manualmente, IntelliJ IDEA consente di generarli automaticamente.

In IntelliJ IDEA, è stato aperto il menu di generazione del codice (Alt + Insert su Windows/Linux, Cmd + N su Mac) e sono stati selezionati equals() e hashCode(). Dopo aver scelto i campi da includere nel confronto, IDEA ha generato automaticamente i metodi necessari.

Esempio pratico

Una fabbrica tiene traccia dei pezzi prodotti, ma il rapporto contiene duplicati così come pezzi difettosi etichettati come DEFECT. L'obiettivo è ripulire l'elenco, mantenendo solo i pezzi unici e non difettosi, ordinarli per nome e visualizzarli nel formato: Name - Serial Number.

Main.java

Main.java

copy
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
package com.example; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Part> parts = List.of( new Part("SN001", "Gear"), new Part("SN002", "Bolt"), new Part("SN003", "Nut"), new Part("SN001", "Gear"), new Part("SN004", "DEFECT Shaft"), new Part("SN005", "Screw"), new Part("SN002", "Bolt"), new Part("SN006", "DEFECT Washer") ); List<String> processedParts = parts.stream() .distinct() .filter(part -> !part.getName().contains("DEFECT")) .sorted((p1, p2) -> p1.getName().compareToIgnoreCase(p2.getName())) .map(part -> part.getName() + " - " + part.getSerialNumber()) .toList(); System.out.println(processedParts); } } class Part { private String serialNumber; private String name; public Part(String serialNumber, String name) { this.serialNumber = serialNumber; this.name = name; } public String getSerialNumber() { return serialNumber; } public String getName() { return name; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Part)) return false; Part part = (Part) o; return serialNumber.equals(part.serialNumber); } @Override public int hashCode() { return serialNumber.hashCode(); } @Override public String toString() { return name + " - " + serialNumber; } }

Per rimuovere i duplicati e filtrare i pezzi difettosi, i metodi equals() e hashCode() devono essere implementati correttamente per confrontare i pezzi tramite il numero di serie.

Successivamente, si utilizza distinct() per eliminare i duplicati, filter() per rimuovere i pezzi difettosi che contengono DEFECT nel nome, sorted() per ordinare i pezzi rimanenti e map() per formattarli come stringhe.

1. Cosa viene utilizzato per confrontare gli elementi nel metodo distinct()?

2. Se due oggetti hanno lo stesso hashCode(), ma il loro metodo equals() restituisce false, saranno considerati uguali nel metodo distinct()?

question mark

Cosa viene utilizzato per confrontare gli elementi nel metodo distinct()?

Select the correct answer

question mark

Se due oggetti hanno lo stesso hashCode(), ma il loro metodo equals() restituisce false, saranno considerati uguali nel metodo distinct()?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 2. Capitolo 7
some-alt