了解新创建实例的方法引用

Understanding method reference with newly created instance

我完全理解这种形式:

Set<T> set = new HashSet<>();
list.stream().allMatch(t -> set.add(t));
// And that
list.stream().allMatch(set::add);

但是这个临时实例真的让我很困惑:

list.stream().allMatch(new HashSet<>()::add);

最有趣的是 hashset 只实例化了一次。

成立于

它与第一个表达式相同,只是您不在上下文中保留对新创建的集合的引用。如果您在 allMatch 调用后不需要集合的值,也是一样的。它本质上是一个方法引用表达式,带有新创建的 HashSet 实例。虽然乍一看可能会令人困惑,但 HashSet 只创建一次,然后方法引用绑定到这个新创建的实例,并在 allMatch 操作的评估中使用。

虽然它可能是一个可行的解决方案,但它可能很危险,尤其是对于非顺序(并行)流管道,因为它违反了 [=20= 中的 allMatch 谓词的 statelessness 要求]合同。