使用方法引用与 HashSet 复制

Duplicate with HashSet using method reference

提问人:AntonBoarf 提问时间:1/15/2020 更新时间:1/15/2020 访问量:349

问:

我想知道我是否有重复的元素。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);
    });
}

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

Lambda Java-8 哈希集

评论

2赞 Holger 1/15/2020
请参阅 System.out::p rintln 的等效 lambda 表达式是什么...
1赞 Holger 1/15/2020
还有这个问答
0赞 Eugene 1/15/2020
可能很明显,但也会起作用。new HashSet<>(list).size() == list.size()
1赞 Holger 1/16/2020
@Eugene是的,但它不是短路。
0赞 Eugene 1/16/2020
@Holger 我在发布后就意识到了这一点;考虑删除与否

答:

6赞 Eran 1/15/2020 #1

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

它等效于在该方法外部创建实例,将对它的引用存储在变量中,然后改用方法引用。也就是说,它将始终在同一个实例上运行。HashSetsetset::addHashSet

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