Eliminering av dubbletter med metoden distinct()
I verkliga utvecklingssituationer stöter du ofta på fall där data innehåller dubbletter som behöver tas bort. Tänk dig till exempel att du sammanställer en lista över konferensdeltagare, men på grund av systemfel har vissa namn registrerats två gånger.
Metoden distinct() hjälper till att lösa detta problem genom att ta bort dubbletter från en stream.
Stream<T> distinct()
Denna metod returnerar en ström som endast innehåller unika element och filtrerar bort alla dubbletter.
Så fungerar det
Metoden distinct() förlitar sig på hashCode() för att snabbt upptäcka potentiella dubbletter och equals() för att bekräfta om de verkligen är identiska. Om två objekt har olika hash-koder betraktas de som unika. Om hash-koderna matchar anropas equals() för att verifiera deras likhet baserat på specifika kriterier.
Tillsammans utgör dessa metoder hashCode() och equals()
kontrakt, vilket säkerställer korrekt jämförelse och borttagning av dubbletter.
Istället för att skriva dem manuellt kan IntelliJ IDEA generera dem automatiskt.
I IntelliJ IDEA öppnade du menyn för kodgenerering (Alt + Insert på Windows/Linux, Cmd + N på Mac) och valde equals() och hashCode(). Efter att ha valt fälten som ska ingå i jämförelsen genererade IDEA automatiskt de nödvändiga metoderna.
Praktiskt exempel
En fabrik håller reda på producerade delar, men rapporten innehåller dubbletter samt defekta delar märkta DEFECT. Målet är att rensa listan, behålla endast unika, icke-defekta delar, sortera dem efter namn och visa dem i formatet: Name - Serial Number.
Main.java
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364package 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; } }
För att ta bort dubbletter och filtrera bort defekta delar måste metoderna equals() och hashCode() vara korrekt implementerade för att jämföra delar efter serial number.
Därefter används distinct() för att eliminera dubbletter, filter() för att ta bort defekta delar som innehåller DEFECT i sitt namn, sorted() för att ordna återstående delar och map() för att formatera dem som strängar.
1. Vad används för att jämföra element i metoden distinct()?
2. Om två objekt har samma hashCode(), men deras metod equals() returnerar false, kommer de att betraktas som samma i metoden distinct()?
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
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
Eliminering av dubbletter med metoden distinct()
Svep för att visa menyn
I verkliga utvecklingssituationer stöter du ofta på fall där data innehåller dubbletter som behöver tas bort. Tänk dig till exempel att du sammanställer en lista över konferensdeltagare, men på grund av systemfel har vissa namn registrerats två gånger.
Metoden distinct() hjälper till att lösa detta problem genom att ta bort dubbletter från en stream.
Stream<T> distinct()
Denna metod returnerar en ström som endast innehåller unika element och filtrerar bort alla dubbletter.
Så fungerar det
Metoden distinct() förlitar sig på hashCode() för att snabbt upptäcka potentiella dubbletter och equals() för att bekräfta om de verkligen är identiska. Om två objekt har olika hash-koder betraktas de som unika. Om hash-koderna matchar anropas equals() för att verifiera deras likhet baserat på specifika kriterier.
Tillsammans utgör dessa metoder hashCode() och equals()
kontrakt, vilket säkerställer korrekt jämförelse och borttagning av dubbletter.
Istället för att skriva dem manuellt kan IntelliJ IDEA generera dem automatiskt.
I IntelliJ IDEA öppnade du menyn för kodgenerering (Alt + Insert på Windows/Linux, Cmd + N på Mac) och valde equals() och hashCode(). Efter att ha valt fälten som ska ingå i jämförelsen genererade IDEA automatiskt de nödvändiga metoderna.
Praktiskt exempel
En fabrik håller reda på producerade delar, men rapporten innehåller dubbletter samt defekta delar märkta DEFECT. Målet är att rensa listan, behålla endast unika, icke-defekta delar, sortera dem efter namn och visa dem i formatet: Name - Serial Number.
Main.java
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364package 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; } }
För att ta bort dubbletter och filtrera bort defekta delar måste metoderna equals() och hashCode() vara korrekt implementerade för att jämföra delar efter serial number.
Därefter används distinct() för att eliminera dubbletter, filter() för att ta bort defekta delar som innehåller DEFECT i sitt namn, sorted() för att ordna återstående delar och map() för att formatera dem som strängar.
1. Vad används för att jämföra element i metoden distinct()?
2. Om två objekt har samma hashCode(), men deras metod equals() returnerar false, kommer de att betraktas som samma i metoden distinct()?
Tack för dina kommentarer!