如何检查Java 8 Streams中是否存在任何重复?

时间:2015-05-05 12:50:13

标签: java duplicates java-8

在java 8中,检查List是否包含任何重复内容的最佳方法是什么?

我的想法是这样的:

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

这是最好的方式吗?

5 个答案:

答案 0 :(得分:40)

您的代码需要遍历所有元素。如果你想确保没有重复的简单方法,如

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;
}

会更有效率,因为它可以在找到非唯一元素时立即为您提供false

此方法也可以使用Stream#allMatch重写为(假设非并行流和线程安全环境),这也是短路的(对于不满足条件的第一个元素立即返回false)< / p>

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

或评论中提到的@Holger

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

答案 1 :(得分:4)

您可以使用计数收集器。

mat

答案 2 :(得分:2)

将此课程作为StreamTool开始,但我认为必须有更好的方法来减少或类似:

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);
    }
}

答案 3 :(得分:0)

使用 set.add() 会更快。

Set<T> items = new HashSet<>();
list.stream().filter(n -> !items.add(n)) 
            .collect(Collectors.toSet());

答案 4 :(得分:-2)

给出数组arr,

arr.length!=Arrays.stream(arr).distinct().count()

将帮助检查重复项