java - 在封闭范围内定义的局部变量日志必须是最终的或实际上是最终的

标签 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 的上下文中,为了实现确定性行为,它们只能被读取,并且应该是常量

如果您的用例是写入到某个对象,那么它应该是例如您的封闭类的一个字段!

所以,长话短说:

  • local 在 lambda 中使用(读取)的变量必须像常量
  • 你不能写入局部变量!
  • 或者反过来:如果你需要写一些东西,你必须使用你周围类的一个字段(或者提供一个回调方法)

关于java - 在封闭范围内定义的局部变量日志必须是最终的或实际上是最终的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38402493/

相关文章:

java - 如何使用 jax rs 将 json 对象传递给 java Rest Web 服务

java - 如何解析具有直接值的数组,两次 json 编码

java - 带有前导空格而不是零的简单日期格式

google-sheets - Google 表格查询函数 : Select Columns by Name

java - @FunctionalInterface 如何影响 JVM 的运行时行为?

java - 如何使一个 ImageView 在按下另一个 ImageView 时消失?

C# ToDictionary lambda 选择索引和元素?

c# - 如何格式化 lambda 表达式和匿名方法以获得最大的可读性?

java - 为什么 Java 说这些类型不兼容?

java - jooq 和 java 8 流 SQL 生成