在java 8中,检查List是否包含任何重复内容的最佳方法是什么?
我的想法是这样的:
list.size() != list.stream().distinct().count()
这是最好的方式吗?
答案 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()
将帮助检查重复项