Java 如何实现方法引用作为谓词?
我是java8新手,我试图理解这段代码。这是一段代码: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
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)
,它应该有效地处理最终实现本身。感谢您提供的示例。经过进一步的阅读,我能够深入地理解正在发生的事情。