java - 在封闭范围内定义的局部变量 log 必须是最终的或有效最终的

标签 java lambda java-8

我是 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/56718191/

相关文章:

java - 使用本地类时构造函数引用无效?

java - 将 foreach 转换为 Java 8 过滤流

java - Thread.sleep() 的替代方案以提高性能?

java - 加载类 'org.slf4j.impl.StaticLoggerBinder' 失败

java - C 就像在 java 中使用整数一样?

c# - 使用 linq 检查列表计数是否一致

java - 下载 PDF 文件时从 itext 获取 Java 堆空间错误

C# - 列表排序 - x 和 y

c++ - 函数指针用作模板参数时是否需要指向具有外部链接的函数?

java - 安装正确的 Java 后,MacOS 上的 Oracle SQLDeveloper 无法打开