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

2023-12-10

我是 lambda 和 Java8 的新手。我面临以下错误。

在封闭范围内定义的局部变量 log 必须是 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)或实际上是最终的(即:您只为其分配一个值once在 lambda 之外)。否则,您无法在 lambda 语句中使用该变量。

但是当然,这与您的使用相冲突log。要点是:您无法从 lambda 内部写入外部内容……因此您必须退后一步,寻找其他方法来完成您想要做的任何事情。

从这个意义上说:只要相信编译器。

除此之外,还有一个core要点理解:可以not使用可以写入的局部变量。局部变量在运行时被“复制”到 lambda 的上下文中,为了实现确定性行为,它们只能被读取,并且应该被读取常量.

如果您的用例是write例如,对于某个对象,那么它应该是您的封闭类的字段!

所以,长话短说:

  • locallambda 内部使用(读取)的变量必须像constant
  • 你不能write到局部变量!
  • 或者反过来:如果您需要写入某些内容,则必须使用周围类的字段(或提供回调方法)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在封闭范围内定义的局部变量 log 必须是最终的或有效最终的 的相关文章

随机推荐