one ejemplo java duplicates java-8

ejemplo - ¿Cómo verificar si existe algún duplicado en Java 8 Streams?



java stream find one (4)

Comencé esta clase como StreamTool, pero creo que debe haber una forma aún mejor de reducir o similar:

public class StreamTool { /** * Whether stream records are unique in that stream. * @param <T> Type of records * @param records * @return true if there are no duplicates, false otherwise */ public static <T> boolean isUnique(Stream<T> records) { return records.allMatch(new HashSet<>()::add); } }

En java 8, ¿cuál es la mejor manera de verificar si una lista contiene algún duplicado?

Mi idea era algo así como:

list.size() != list.stream().distinct().count()

¿Es la mejor manera?


Puede usar el colector de conteo.

Stream.of(1, 3, 4, 6, 7, 5, 6) .collect(Collectors.groupingBy( Function.identity(), Collectors.counting())) .entrySet().stream().anyMatch(e -> e.getValue() > 1)


Su código necesitaría iterar sobre todos los elementos. Si quieres asegurarte de que no hay duplicados, puedes utilizar un método simple como

public static <T> boolean containsUnique(List<T> list){ Set<T> set = new HashSet<>(); for (T t: list){ if (!set.add(t)) return false; } return true; }

sería más eficiente.

Este método también podría reescribirse como (suponiendo transmisiones no paralelas y entorno seguro para subprocesos)

public static <T> boolean containsUnique(List<T> list){ Set<T> set = new HashSet<>(); return list.stream().allMatch(t -> set.add(t)); }

o como @Holger menciona en el comentario

public static <T> boolean containsUnique(List<T> list){ return list.stream().allMatch(new HashSet<>()::add); }


Usé lo siguiente:
1. return list.size() == new HashSet<>(list).size(); .

No estoy seguro de cómo se compara con:
2. return list.size() == list.stream().distinct().count();
y
3. return list.stream().sequential().allMatch(new HashSet<>()::add);
en términos de rendimiento.

El último (# 3) tiene la posibilidad de manejar no solo colecciones (por ejemplo, listas), sino también transmisiones (sin recopilarlas explícitamente).