Java 我能把这个消费者转换成lambda吗
正如标题所述。 我希望将此代码转换为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
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]);