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/61620803/

相关文章:

java - 如何通过命令提示符更改包名称、编译和签名黑莓java应用程序?

lambda - 从Kendo UI网格中创建具有相关对象的表达式[FilterDescriptor]

java - 我可以结合java8(流,lambda)和 Guava 吗?

JavaFX TitledPane 更改的标题背景在鼠标输入时重置

java - 使用 Log4J 2 进行 JNDI 变量查找时如何设置默认值?

java - 我现在可以使用 Android 开发 "use"Java 8 吗?

java - 为什么某些对象方法不能从默认方法调用?

eclipse - 如何使用 Eclipse 在 Java 8 中调试 lambda 表达式?

postgresql - api 属性文件中的 MD5 哈希数据库密码

python - Lambda 函数在 Python 3 和 Python 2 中的行为不同