我想知道我的List<T>
是否具有重复元素。
我看过下面的方法:
public static <T> boolean areAllUnique(List<T> list){
return list.stream().allMatch(new HashSet<>()::add);
}
它有效,为什么呢?因为似乎每次都会创建一个新的HashSet <>(所以基本上,即使重复,该方法也应始终返回true)
如果我改写上面的方法,它将不再起作用:
public static <T> boolean areAllUnique(List<T> list){
return list.stream().allMatch(t -> {
return new HashSet<>().add(t);
});
}
我很惊讶第一种方法有效,而另一种却没有。因为对我来说他们看起来一样
最佳答案
new HashSet<>()::add
是引用HashSet
的特定实例的方法引用。
这等效于在该方法之外创建HashSet
的实例,将对其的引用存储在变量set
中,并改用方法引用set::add
。即它将始终在相同的HashSet
实例上运行。
lambda表达式的行为有所不同,因为每次allMatch()
必须将Predicate
应用于Stream
的元素时,都会执行lambda表达式的主体。每次执行主体时,都会创建一个新的HashSet
实例。
关于lambda - 使用方法引用与HashSet复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59748376/