猿问

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

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


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

someObj.getStringValue()引用某个对象并getStringValue()返回某个字符串值。


传入的方法引用的等效谓词是什么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在封闭范围中定义的局部变量必须是最终的或有效的最终”。任何对此的解释都值得赞赏。


慕虎7371278
浏览 88回答 1
1回答

桃花长相依

该someObj.getStringValue()表达式在外部求值,因此等效代码为:final String x = someObject.getStringValue();Predicate<String> p = new Predicate<String>() {&nbsp; &nbsp; @Override&nbsp; &nbsp; public boolean test(String t) {&nbsp; &nbsp; &nbsp; &nbsp; return x.equalsIgnoreCase(t);&nbsp; &nbsp; }}Stream.of("A", "B", "C").anyMatch(p)其中局部变量x也是“匿名”的。因此,someObject不需要是有效的最终的。您可以通过在调试器中放置断点来验证lambda 表达式getStringValue()的此行为。即使该test()方法被调用 3 次(因为流有 3 个元素,并且假设没有匹配项),该getStringValue()方法也只会被调用一次。
随时随地看视频慕课网APP

相关分类

Java
我要回答