我是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
必须是最终的或实际上是最终的”。对此的任何解释均应赞赏。 最佳答案
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()
方法将仅被调用一次。