Java Stream API:如何向Predicate传递流外对象?
你遇到的问题是匿名内部类里的this指向的是Predicate实例,不是外部的JtestSuppressDelombokVisitor,所以调用不了外部类的getCursor()。有两种简单的解决方式,完全可以用Stream API重构代码:
方法1:提前捕获外部类的Cursor实例
先把外部类的getCursor()结果存到一个变量里(Java 8及以后不需要显式加final,只要后续不修改就是effectively final,能被匿名内部类访问):
// 提前获取外部类的Cursor实例 Cursor cursor = this.getCursor(); boolean alreadyHasSuppressComment = methodDecl.getPrefix().getComments().stream() .anyMatch(new Predicate<Comment>() { @Override public boolean test(Comment comment) { PrintOutputCapture<String> p = new PrintOutputCapture<String>(""); comment.printComment(cursor, p); // 使用提前捕获的cursor变量 return p.out.toString().matches(".*parasoft-begin-suppress\\sALL.*"); } });
方法2:使用Lambda表达式替代匿名内部类
Lambda表达式里的this会直接指向外部的JtestSuppressDelombokVisitor实例,不用额外处理,写法更简洁:
boolean alreadyHasSuppressComment = methodDecl.getPrefix().getComments().stream() .anyMatch(comment -> { PrintOutputCapture<String> p = new PrintOutputCapture<>(""); comment.printComment(this.getCursor(), p); // 这里的this就是外部类实例 return p.out.toString().matches(".*parasoft-begin-suppress\\sALL.*"); });
注意:正则表达式里的\s要写成\\s,不然在Java字符串中会被解析为转义字符,导致匹配逻辑出错——你原有的代码也存在这个问题,需要修正。
总结:完全可以用Stream API实现需求,核心是正确处理外部类的实例引用,要么提前捕获变量,要么用Lambda表达式简化写法。
内容的提问来源于stack exchange,提问作者SATO Yusuke
相关产品推荐
相关产品推荐

