我是 lambda 和 Java8 的新手。我面临以下错误。
Local variable log defined in an enclosing scope must be final or effectively final
public JavaRDD<String> modify(JavaRDD<String> filteredRdd) {
filteredRdd.map(log -> {
placeHolder.forEach(text -> {
//error comes here
log = log.replace(text, ",");
});
return log;
});
return null;
}
最佳答案
该消息准确说明了问题所在:您的变量 log 必须是最终变量(即:带有关键字final)或实际上是最终变量(即:您只为其分配一个值< em>一旦在 lambda 之外)。否则,您无法在 lambda 语句中使用该变量。
但是,当然,这与您对 log 的使用相冲突。要点是:您无法从 lambda 内部写入外部内容...因此您必须退后一步,寻找其他方法来完成您想要做的任何事情。
从这个意义上说:只要相信编译器。
除此之外,还有一个核心点需要理解:您不能不使用可写入的局部变量。局部变量在运行时被“复制”到 lambda 的上下文中,为了实现确定性行为,它们只能读取,并且应该是常量。
如果您的用例是写入某个对象,那么它应该是您的封闭类的字段!
所以,长话短说:
- 在 lambda 中使用(读取)的局部变量必须像常量一样工作
- 您不能写入局部变量!
- 或者相反:如果您需要写入内容,则必须使用周围类的字段(或提供回调方法)
关于java - 在封闭范围内定义的局部变量 log 必须是最终的或有效最终的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61620803/