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).