javajava-8duplicatesjava-stream

How to check if exists any duplicate in Java 8 Streams?


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?


Solution

  • 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 using Stream#allMatch which also is short-circuit (returns false immediately for first element which doesn't fulfill provided condition)
    (assuming non-parallel streams and thread-safe environment)

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

    which can be farther shortened as @Holger pointed out in comment

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