使用方法参考与 HashSet 复制
Duplicate with HashSet using method reference
我想知道我的 List<T>
是否有重复的元素。
我看过下面的方法:
public static <T> boolean areAllUnique(List<T> list){
return list.stream().allMatch(new HashSet<>()::add);
}
它有效,我很惊讶为什么?因为似乎每次都会创建一个新的 HashSet<>(所以基本上该方法应该始终 return 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
实例。
我想知道我的 List<T>
是否有重复的元素。
我看过下面的方法:
public static <T> boolean areAllUnique(List<T> list){
return list.stream().allMatch(new HashSet<>()::add);
}
它有效,我很惊讶为什么?因为似乎每次都会创建一个新的 HashSet<>(所以基本上该方法应该始终 return 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
实例。