我是 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 的上下文中,为了实现确定性行为,它们只能被读取,并且应该是常量。
如果您的用例是写入到某个对象,那么它应该是例如您的封闭类的一个字段!
所以,长话短说:
- local 在 lambda 中使用(读取)的变量必须像常量
- 你不能写入局部变量!
- 或者反过来:如果你需要写一些东西,你必须使用你周围类的一个字段(或者提供一个回调方法)
关于java - 在封闭范围内定义的局部变量日志必须是最终的或实际上是最终的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38402493/