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

时间:2016-11-02 20:38:24

标签: lambda java-8 method-reference

我完全理解这种形式:

<Style.Triggers>
        <DataTrigger Binding="{Binding YourBinaryOption}" Value="True">
                 <Setter Property="Visibility" Value="Visible" />
        </DataTrigger>
        <DataTrigger Binding="{Binding YourBinaryOption}" Value="False">
                 <Setter Property="Visibility" Value="Collapsed" />
        </DataTrigger>
</Style.Triggers>

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

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

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

成立于this topic

1 个答案:

答案 0 :(得分:4)

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

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