Ant*_*arf 5 lambda hashset java-8
我想知道我List<T>是否有重复的元素。
我看过下面的方法:
public static <T> boolean areAllUnique(List<T> list){
return list.stream().allMatch(new HashSet<>()::add);
}
Run Code Online (Sandbox Code Playgroud)
它有效,我很惊讶为什么?因为似乎每次都会创建一个新的 HashSet<> (所以基本上该方法应该总是返回 true 即使重复)
如果我以不同的方式编写上述方法,它将不再有效:
public static <T> boolean areAllUnique(List<T> list){
return list.stream().allMatch(t -> {
return new HashSet<>().add(t);
});
}
Run Code Online (Sandbox Code Playgroud)
我很惊讶第一种方法有效而另一种方法无效。因为对我来说它们看起来一样
new HashSet<>()::add是引用 a 的特定实例的方法引用HashSet。
它等同于HashSet在该方法之外创建一个实例,将对其的引用存储在变量中set,然后使用方法引用set::add代替。即它将始终在同一个HashSet实例上运行。
lambda 表达式的行为不同,因为每次执行 lambda 表达式的主体时allMatch()都必须将 应用于 的Predicate元素Stream。每次执行主体时,HashSet都会创建一个新实例。
| 归档时间: |
|
| 查看次数: |
139 次 |
| 最近记录: |