我是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在封闭范围中定义的局部变量必须是最终的或有效的最终”。任何对此的解释都值得赞赏。
1 回答
桃花长相依
TA贡献1860条经验 获得超8个赞
该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不需要是有效的最终的。
您可以通过在调试器中放置断点来验证lambda 表达式getStringValue()的此行为。即使该test()方法被调用 3 次(因为流有 3 个元素,并且假设没有匹配项),该getStringValue()方法也只会被调用一次。
添加回答
举报
0/150
提交
取消