如何将方法引用实现为谓词?

时间:2019-10-10 23:47:47

标签: java java-8 java-stream predicate

我是java8的新手,我试图理解这段代码。这是一段代码:

Stream.of("A", "B", "C").anyMatch(someObj.getStringValue()::equalsIgnoreCase)

someObj.getStringValue()引用某个对象,而getStringValue()返回一些String值。

传递给anyMatch(...)的方法引用的等效谓词是什么?

我的理解是,这等同于:

Predicate<String> p = new Predicate<String>() {
    @Override
    public boolean test(String t) {
        return someObject.getStringValue().equalsIgnoreCase(t);
    }
}
Stream.of("A", "B", "C").anyMatch(p)

这样我得到一个错误“在封闭范围内定义的局部变量someObject必须是最终的或实际上是最终的”。感谢对此的任何解释。

1 个答案:

答案 0 :(得分:3)

someObj.getStringValue()表达式是在外部求值的,因此等效代码为:

final String x = someObject.getStringValue();
Predicate<String> p = new Predicate<String>() {
    @Override
    public boolean test(String t) {
        return x.equalsIgnoreCase(t);
    }
}
Stream.of("A", "B", "C").anyMatch(p)

其中本地变量x也是“匿名”的。

正因为如此,someObject不一定要有效地排在最后。

您可以在调试器中通过在getStringValue()中放置一个断点来验证 lambda表达式的行为。即使test()方法被调用了3次(因为流中有3个元素,并且假设没有匹配项),getStringValue()方法也仅被调用了一次。