使用方法引用与 HashSet 进行复制

问题描述 投票:0回答:2

我想知道我的

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 hashset
2个回答
6
投票

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

这相当于在该方法外部创建

HashSet
的实例,将对其的引用存储在变量
set
中,并使用方法引用
set::add
代替。即它总是在同一个
HashSet
实例上运行。

lambda 表达式的行为有所不同,因为每次

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


0
投票

我想问一下用作谓词的方法引用

set::add
的范围是什么? 我希望这不是全球性的。

© www.soinside.com 2019 - 2024. All rights reserved.