为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕虎7371278 2023-10-13 14:50:16
我是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()方法也只会被调用一次。


查看完整回答
反对 回复 2023-10-13
  • 1 回答
  • 0 关注
  • 66 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信