lambda - 使用方法引用与HashSet复制

标签 lambda java-8 hashset

我想知道我的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/

相关文章:

java - 什么是 Java 中静态字段的初始值设定项

java - 如何使用java8获取上周和上个月

java - <identifier> HashSet 上的 add 方法出现预期 Java 编译时错误

java - 制作一个 Hashmap,其键是字符串,值是 HashSets

java - 无法从 HashSet 中删除自定义对象

SQL返回连续记录

python - any = lambda v : v mean? 是什么意思

c++ - 为什么我不能在 C++14 的 lambda 中 move std::unique_ptr?

java - 为什么返回的函数需要额外的转换(不兼容的类型)?