Java 我能把这个消费者转换成lambda吗

Java 我能把这个消费者转换成lambda吗,java,lambda,Java,Lambda,正如标题所述。 我希望将此代码转换为lambda,这可能吗 crashFile.forEach(new Consumer<String>() { String lastLine; @Override public void accept(String line) { if((title == null || title.equals("")) && line.contains("at")) { title

正如标题所述。 我希望将此代码转换为lambda,这可能吗

crashFile.forEach(new Consumer<String>() {
    String lastLine;
    @Override
    public void accept(String line) {
        if((title == null || title.equals("")) && line.contains("at")) {
            title = lastLine;
        }
        lastLine = line;
    }
});
crashFile.forEach(新消费者(){
字符串最后一行;
@凌驾
公共无效接受(字符串行){
如果((title==null | | title.equals(“”)和&line.contains(“)){
标题=最后一行;
}
最后一行=第二行;
}
});

不可能直接做到

lambda不能有状态(在从其周围上下文捕获的任何状态之外)。即使他们可以,访问它也会有点尴尬,因为
这个
指的是周围的上下文(即,lambda在其方法中定义的对象),而不是lamdba的实例。这是在中指定的


您可以在lambda之前声明一个
AtomicReference
,然后使用它来管理
lastLine
状态;但这可能是对lambdas的滥用,而不是惯用的用法。lambda实际上被设计成非常无状态的,除非它们捕获其周围上下文的状态(这就是为什么15.27.2)指定
引用该上下文,而不是lambda)。

您不能有封装的字段,但可以有对1的数组的引用

String[] lastLine = { null };
crashFile.forEach(line -> {
    if((title == null || title.equals("")) && line.contains("at")) {
        title = lastLine[0];
    }
    lastLine[0] = line;
});
System.out.println("The last line was " + lastLine[0]);