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

标签 java java-8 duplicates java-stream

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

我的想法是这样的:

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

这是最好的方法吗?

最佳答案

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

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)
(假设非并行流和线程安全环境)

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

可以进一步缩短为 @Holger pointed out in comment

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

关于java - 如何检查 Java 8 Streams 中是否存在任何重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30053487/

相关文章:

bash - 删除所有出现的重复行

java - 为什么处理(Java)中的这个静态属性会引发错误?

tomcat - 从 Cygwin 使用 Tomcat,接收 ClassNotFoundException,

java - 等价于 Scala dropWhile

java - 将元素插入流

Java从列表中删除某些属性重复的条目

insert - 插入时 DB2 重复键错误,但在选择计数(*)后工作

ide - 源代码中可以指定JDK版本吗?

java - JAX-RS 授权获取更多数据

java - IllegalArg 与 null 检查