使用方法引用与 HashSet 重复

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)

我很惊讶第一种方法有效而另一种方法无效。因为对我来说它们看起来一样

Era*_*ran 6

new HashSet<>()::add是引用 a 的特定实例的方法引用HashSet

它等同于HashSet在该方法之外创建一个实例,将对其的引用存储在变量中set,然后使用方法引用set::add代替。即它将始终在同一个HashSet实例上运行。

lambda 表达式的行为不同,因为每次执行 lambda 表达式的主体时allMatch()都必须将 应用于 的Predicate元素Stream。每次执行主体时,HashSet都会创建一个新实例。