如何检查Java 8 Streams中是否存在任何重复项?
2022-08-31 16:24:31
在java 8中,检查List是否包含任何重复项的最佳方法是什么?
我的想法是这样的:
list.size() != list.stream().distinct().count()
这是最好的方法吗?
在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));
}
public static <T> boolean areAllUnique(List<T> list){
return list.stream().allMatch(new HashSet<>()::add);
}
我使用了以下内容:
1. .return list.size() == new HashSet<>(list).size();
我不确定它与:
2.
和
3相比如何。
在性能方面。return list.size() == list.stream().distinct().count();
return list.stream().sequential().allMatch(new HashSet<>()::add);
最后一个(#3)不仅可以处理集合(例如列表),还可以处理流(无需显式收集它们)。
Upd.:最后一个(#3)似乎是最好的,不仅因为它可以处理纯流,还因为它在第一个副本上停止(而#1和#2总是迭代到最后) - 正如@Pshemo在评论中所说的那样。