Duplicaten Verwijderen Met de distinct()-Methode
In de praktijk van softwareontwikkeling kom je vaak situaties tegen waarin gegevens duplicaten bevatten die verwijderd moeten worden. Stel je bijvoorbeeld voor dat je een lijst van conferentiebezoekers samenstelt, maar door systeemfouten zijn sommige namen dubbel geregistreerd.
De methode distinct() lost dit probleem op door dubbele elementen uit een stream te verwijderen.
Stream<T> distinct()
Deze methode retourneert een stream met alleen unieke elementen, waarbij alle duplicaten worden gefilterd.
Werking
De distinct()-methode maakt gebruik van hashCode() om snel mogelijke duplicaten te detecteren en van equals() om te bevestigen of ze daadwerkelijk identiek zijn. Als twee objecten verschillende hashcodes hebben, worden ze als uniek beschouwd. Als de hashcodes overeenkomen, wordt equals() aangeroepen om hun gelijkheid te verifiëren op basis van specifieke criteria.
Samen vormen deze methoden het hashCode() en equals()
contract, wat zorgt voor correcte vergelijking en verwijdering van duplicaten.
In plaats van deze handmatig te schrijven, biedt IntelliJ IDEA de mogelijkheid om ze automatisch te genereren.
In IntelliJ IDEA is het codegeneratie-menu geopend (Alt + Insert op Windows/Linux, Cmd + N op Mac) en zijn equals() en hashCode() geselecteerd. Na het kiezen van de velden die in de vergelijking moeten worden opgenomen, genereert IDEA automatisch de benodigde methoden.
Praktisch Voorbeeld
Een fabriek houdt de geproduceerde onderdelen bij, maar het rapport bevat duplicaten en defecte onderdelen met het label DEFECT. Het doel is om de lijst te opschonen, zodat alleen unieke, niet-defecte onderdelen overblijven, deze te sorteren op naam en weer te geven in het formaat: 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; } }
Om duplicaten te verwijderen en defecte onderdelen te filteren, moeten de methoden equals() en hashCode() correct worden geïmplementeerd om onderdelen te vergelijken op serienummer.
Daarna wordt distinct() gebruikt om duplicaten te elimineren, filter() om defecte onderdelen met DEFECT in de naam te verwijderen, sorted() om de resterende onderdelen te ordenen en map() om ze als strings te formatteren.
1. Wat wordt gebruikt om elementen te vergelijken in de distinct()-methode?
2. Als twee objecten dezelfde hashCode() hebben, maar hun equals()-methode geeft false terug, worden ze dan als hetzelfde beschouwd in de distinct()-methode?
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
Awesome!
Completion rate improved to 2.33
Duplicaten Verwijderen Met de distinct()-Methode
Veeg om het menu te tonen
In de praktijk van softwareontwikkeling kom je vaak situaties tegen waarin gegevens duplicaten bevatten die verwijderd moeten worden. Stel je bijvoorbeeld voor dat je een lijst van conferentiebezoekers samenstelt, maar door systeemfouten zijn sommige namen dubbel geregistreerd.
De methode distinct() lost dit probleem op door dubbele elementen uit een stream te verwijderen.
Stream<T> distinct()
Deze methode retourneert een stream met alleen unieke elementen, waarbij alle duplicaten worden gefilterd.
Werking
De distinct()-methode maakt gebruik van hashCode() om snel mogelijke duplicaten te detecteren en van equals() om te bevestigen of ze daadwerkelijk identiek zijn. Als twee objecten verschillende hashcodes hebben, worden ze als uniek beschouwd. Als de hashcodes overeenkomen, wordt equals() aangeroepen om hun gelijkheid te verifiëren op basis van specifieke criteria.
Samen vormen deze methoden het hashCode() en equals()
contract, wat zorgt voor correcte vergelijking en verwijdering van duplicaten.
In plaats van deze handmatig te schrijven, biedt IntelliJ IDEA de mogelijkheid om ze automatisch te genereren.
In IntelliJ IDEA is het codegeneratie-menu geopend (Alt + Insert op Windows/Linux, Cmd + N op Mac) en zijn equals() en hashCode() geselecteerd. Na het kiezen van de velden die in de vergelijking moeten worden opgenomen, genereert IDEA automatisch de benodigde methoden.
Praktisch Voorbeeld
Een fabriek houdt de geproduceerde onderdelen bij, maar het rapport bevat duplicaten en defecte onderdelen met het label DEFECT. Het doel is om de lijst te opschonen, zodat alleen unieke, niet-defecte onderdelen overblijven, deze te sorteren op naam en weer te geven in het formaat: 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; } }
Om duplicaten te verwijderen en defecte onderdelen te filteren, moeten de methoden equals() en hashCode() correct worden geïmplementeerd om onderdelen te vergelijken op serienummer.
Daarna wordt distinct() gebruikt om duplicaten te elimineren, filter() om defecte onderdelen met DEFECT in de naam te verwijderen, sorted() om de resterende onderdelen te ordenen en map() om ze als strings te formatteren.
1. Wat wordt gebruikt om elementen te vergelijken in de distinct()-methode?
2. Als twee objecten dezelfde hashCode() hebben, maar hun equals()-methode geeft false terug, worden ze dan als hetzelfde beschouwd in de distinct()-methode?
Bedankt voor je feedback!