我是 lambda 和 Java8 的新手。我面临以下错误。
在封闭范围内定义的局部变量日志必须是最终的或实际上是最终的
public JavaRDD<String> modify(JavaRDD<String> filteredRdd) {
filteredRdd.map(log -> {
placeHolder.forEach(text -> {
//error comes here
log = log.replace(text, ",");
});
return log;
});
return null;
}
原文由 Balaji Reddy 发布,翻译遵循 CC BY-SA 4.0 许可协议
该消息准确说明了问题所在:您的变量 log 必须是最终的(即:携带关键字 final)或实际上是最终的(即:您只在 lambda 之外为其赋值 _一次_)。否则,您不能在 lambda 语句中使用该变量。
但是,当然,这与您对 log 的使用相冲突。关键是:你不能从 lambda 内部写入外部的东西……所以你必须退后一步并寻找其他方式来完成你打算做的事情。
从这个意义上说:只要相信编译器。
除此之外,还有一个 核心 点需要理解:你 不能 使用你可以写入的局部变量。局部变量在运行时被“复制”到 lambda 的上下文中,为了实现确定性行为,它们只能被读取,并且应该是 常量。
如果您的用例是 写入 某个对象,那么它应该是您的封闭类的一个字段!
所以,长话短说: