Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Eliminación de Duplicados con el Método distinct() | Operaciones Intermedias en Stream API
Stream API

bookEliminación de Duplicados con el Método distinct()

En el desarrollo del mundo real, a menudo se presentan situaciones en las que los datos contienen duplicados que deben eliminarse. Por ejemplo, imagina que estás compilando una lista de asistentes a una conferencia, pero debido a errores del sistema, algunos nombres se han registrado dos veces.

El método distinct() ayuda a resolver este problema eliminando elementos duplicados de un stream.

Stream<T> distinct()

Este método devuelve un stream que contiene solo elementos únicos, filtrando cualquier duplicado.

Cómo funciona

El método distinct() se basa en hashCode() para detectar rápidamente posibles duplicados y en equals() para confirmar si realmente son idénticos. Si dos objetos tienen hash codes diferentes, se consideran únicos. Si los hash codes coinciden, se llama a equals() para verificar su igualdad según criterios específicos.

Juntos, estos métodos forman el contrato de hashCode() y equals() contract, asegurando una comparación y eliminación de duplicados adecuada.

En lugar de escribirlos manualmente, IntelliJ IDEA permite generarlos automáticamente.

En IntelliJ IDEA, se abrió el menú de generación de código (Alt + Insert en Windows/Linux, Cmd + N en Mac) y se seleccionaron equals() y hashCode(). Después de elegir los campos a incluir en la comparación, IDEA generó automáticamente los métodos necesarios.

Ejemplo práctico

Una fábrica registra las piezas producidas, pero el informe contiene duplicados así como piezas defectuosas etiquetadas como DEFECT. El objetivo es depurar la lista, conservando solo las piezas únicas y no defectuosas, ordenarlas por nombre y mostrarlas en el 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; } }

Para eliminar duplicados y filtrar las piezas defectuosas, los métodos equals() y hashCode() deben estar correctamente implementados para comparar las piezas por número de serie.

Después de esto, se utiliza distinct() para eliminar duplicados, filter() para descartar las piezas defectuosas que contienen DEFECT en su nombre, sorted() para ordenar las piezas restantes y map() para formatearlas como cadenas de texto.

1. ¿Qué se utiliza para comparar elementos en el método distinct()?

2. Si dos objetos tienen el mismo hashCode(), pero su método equals() devuelve false, ¿serán considerados iguales en el método distinct()?

question mark

¿Qué se utiliza para comparar elementos en el método distinct()?

Select the correct answer

question mark

Si dos objetos tienen el mismo hashCode(), pero su método equals() devuelve false, ¿serán considerados iguales en el método distinct()?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 2. Capítulo 7

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

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

bookEliminación de Duplicados con el Método distinct()

Desliza para mostrar el menú

En el desarrollo del mundo real, a menudo se presentan situaciones en las que los datos contienen duplicados que deben eliminarse. Por ejemplo, imagina que estás compilando una lista de asistentes a una conferencia, pero debido a errores del sistema, algunos nombres se han registrado dos veces.

El método distinct() ayuda a resolver este problema eliminando elementos duplicados de un stream.

Stream<T> distinct()

Este método devuelve un stream que contiene solo elementos únicos, filtrando cualquier duplicado.

Cómo funciona

El método distinct() se basa en hashCode() para detectar rápidamente posibles duplicados y en equals() para confirmar si realmente son idénticos. Si dos objetos tienen hash codes diferentes, se consideran únicos. Si los hash codes coinciden, se llama a equals() para verificar su igualdad según criterios específicos.

Juntos, estos métodos forman el contrato de hashCode() y equals() contract, asegurando una comparación y eliminación de duplicados adecuada.

En lugar de escribirlos manualmente, IntelliJ IDEA permite generarlos automáticamente.

En IntelliJ IDEA, se abrió el menú de generación de código (Alt + Insert en Windows/Linux, Cmd + N en Mac) y se seleccionaron equals() y hashCode(). Después de elegir los campos a incluir en la comparación, IDEA generó automáticamente los métodos necesarios.

Ejemplo práctico

Una fábrica registra las piezas producidas, pero el informe contiene duplicados así como piezas defectuosas etiquetadas como DEFECT. El objetivo es depurar la lista, conservando solo las piezas únicas y no defectuosas, ordenarlas por nombre y mostrarlas en el 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; } }

Para eliminar duplicados y filtrar las piezas defectuosas, los métodos equals() y hashCode() deben estar correctamente implementados para comparar las piezas por número de serie.

Después de esto, se utiliza distinct() para eliminar duplicados, filter() para descartar las piezas defectuosas que contienen DEFECT en su nombre, sorted() para ordenar las piezas restantes y map() para formatearlas como cadenas de texto.

1. ¿Qué se utiliza para comparar elementos en el método distinct()?

2. Si dos objetos tienen el mismo hashCode(), pero su método equals() devuelve false, ¿serán considerados iguales en el método distinct()?

question mark

¿Qué se utiliza para comparar elementos en el método distinct()?

Select the correct answer

question mark

Si dos objetos tienen el mismo hashCode(), pero su método equals() devuelve false, ¿serán considerados iguales en el método distinct()?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 2. Capítulo 7
some-alt