了解新创建实例的方法引用
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 要求]合同。
我完全理解这种形式:
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 要求]合同。