在 java 8 中,检查列表是否包含重复项的最佳方法是什么?
我的想法是这样的:
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 https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#allMatch-java.util.function.Predicate-这也是短路的(对于不满足所提供条件的第一个元素立即返回 false)
(假设非并行流和线程安全环境)
public static <T> boolean areAllUnique(List<T> list){
Set<T> set = new HashSet<>();
return list.stream().allMatch(t -> set.add(t));
}
可以进一步缩短为@Holger https://stackoverflow.com/users/2711488/holger 评论中指出 https://stackoverflow.com/questions/30053487/how-to-check-if-exists-any-duplicate-in-java-8-streams/30053822#comment48222350_30053822
public static <T> boolean areAllUnique(List<T> list){
return list.stream().allMatch(new HashSet<>()::add);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)