In java 8, what's the best way to check if a List contains any duplicate?
My idea was something like:
list.size() != list.stream().distinct().count()
Is it the best way?
Your code would need to iterate over all elements. If you want to make sure that there are no duplicates simple method like
public static <T> boolean areAllUnique(List<T> list){
Set<T> set = new HashSet<>();
for (T t: list){
if (!set.add(t))
return false;
}
return true;
}
would be more efficient since it can give you false
immediately when first non-unique element would be found.
This method could also be rewritten as (assuming non-parallel streams and thread-safe environment) using Stream#allMatch
which also is short-circuit (returns false immediately for first element which doesn't fulfill provided condition)
public static <T> boolean areAllUnique(List<T> list){
Set<T> set = new HashSet<>();
return list.stream().allMatch(t -> set.add(t));
}
or as @Holger mentioned in comment
public static <T> boolean areAllUnique(List<T> list){
return list.stream().allMatch(new HashSet<>()::add);
}