如何将方法引用实现为谓词?
How to implement method reference as a predicate?
我是 java8 的新手,我试图理解这段代码。这是一段代码:
Stream.of("A", "B", "C").anyMatch(someObj.getStringValue()::equalsIgnoreCase)
someObj.getStringValue()
引用一些对象和 getStringValue()
returns 一些字符串值。
传递给 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)
有了这个我得到了错误"Local variable someObject
defined in an enclosing scope must be final or effectively final."任何解释都表示赞赏。
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
也是"anonymous"。
因此,someObject
不需要 有效最终。
您可以在调试器中验证 lambda 表达式 的这种行为,方法是在 getStringValue()
中放置一个断点。即使 test()
方法被调用了 3 次(因为流有 3 个元素,并且假设没有匹配),getStringValue()
方法只会被调用一次。
我是 java8 的新手,我试图理解这段代码。这是一段代码:
Stream.of("A", "B", "C").anyMatch(someObj.getStringValue()::equalsIgnoreCase)
someObj.getStringValue()
引用一些对象和 getStringValue()
returns 一些字符串值。
传递给 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)
有了这个我得到了错误"Local variable someObject
defined in an enclosing scope must be final or effectively final."任何解释都表示赞赏。
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
也是"anonymous"。
因此,someObject
不需要 有效最终。
您可以在调试器中验证 lambda 表达式 的这种行为,方法是在 getStringValue()
中放置一个断点。即使 test()
方法被调用了 3 次(因为流有 3 个元素,并且假设没有匹配),getStringValue()
方法只会被调用一次。