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

Java 如何实现方法引用作为谓词?,java,java-8,java-stream,predicate,Java,Java 8,Java Stream,Predicate,我是java8新手,我试图理解这段代码。这是一段代码: Stream.of("A", "B", "C").anyMatch(someObj.getStringValue()::equalsIgnoreCase) someObj.getStringValue()引用一些对象,而getStringValue()返回一些字符串值 传递到anyMatch(…)的方法引用的等价谓词是什么 我的理解是,这相当于: Predicate<String> p = new Predicate<S

我是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)
谓词p=新谓词(){
@凌驾
公共布尔测试(字符串t){
返回someObject.getStringValue().equalsIgnoreCase(t);
}
}
“A”、“B”、“C”流。任意匹配(p)

这样我就得到了错误“局部变量
someObject
在封闭范围内定义必须是最终的或有效的最终的。”对此的任何解释都是值得赞赏的。
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)
final String x=someObject.getStringValue();
谓词p=新谓词(){
@凌驾
公共布尔测试(字符串t){
返回x.equalsIgnoreCase(t);
}
}
“A”、“B”、“C”流。任意匹配(p)
其中局部变量
x
也是“匿名”的

因此,
someObject
不需要是有效的final


通过在
getStringValue()
中放置断点,可以在调试器中验证lambda表达式的此行为。尽管
test()
方法被调用了3次(因为流有3个元素,并且假设没有匹配),但是
getStringValue()
方法将只被调用一次。

请参阅,以了解final和effective final的含义。这是一个问得很好的问题,但我担心理解一个代码段是重复的,您不必将其重写为更简单的构造
someObj.getStringValue()::equalsIgnoreCase
简洁而富有表现力。我会在
null
上检查
someObj
,并将
someObj.getStringValue()
保存为一个变量,并使用该变量,如
thatVariable::equalsIgnoreCase
即使要显式声明
谓词
,也可以使用lambda作为
谓词p=t->someObject.getStringValue().equalsIgnoreCase(t)
,它应该有效地处理最终实现本身。感谢您提供的示例。经过进一步的阅读,我能够深入地理解正在发生的事情。