这个问题以前在这里问过
我关于为什么在这里回答的问题
但我对这个答案有一些怀疑。提供的答案提到-
为了降低bug的风险,他们决定确保捕获的变量永远不会变异。我对它会导致并发问题的说法感到困惑。
我在Baeldung上读了一篇关于并发问题的文章,但我仍然对它如何导致并发问题感到有点困惑,有人能用一个例子来帮助我吗?提前谢了。
当创建lambda表达式的实例时,它所引用的封闭作用域中的任何变量都将复制到该实例中。现在,假设允许修改它,现在您正在处理副本中的一个陈旧值。另一方面,假设副本在lambda中被修改,但封闭作用域中的值仍然没有更新,从而留下不一致性。因此,为了防止这种情况发生,语言设计者施加了这种限制。这可能也会让他们的生活更轻松。可以在这里找到匿名内部类的相关答案。
另一点是,您可以到处传递lambda表达式,如果它被转义并由不同的线程执行,而当前线程正在更新相同的局部变量,那么也会出现一些并发问题。
因为这很管用。看起来只有变量名finalResponse在工作。怎么做,为什么?这样做有效吗?
我正在研究Java8流,我理解lambdas的唯一问题是为什么lambdas中有效的最后警告被忽略,例如实例(和静态)变量。我似乎在网上找不到任何关于它的参考,因为大多数页面只会谈论“有效最终”的定义。
lambda表达式中使用的变量应为final或有效final 当我尝试使用时,它显示了这个错误。
问题内容: lambda表达式中使用的变量应该是final或有效的final 当我尝试使用它时会显示此错误。 问题答案: 可变装置,它可以被实例化一次。在Java中,你不能在lambda以及匿名内部类中使用非最终变量。 你可以使用旧的for-each循环来重构代码: 即使我对这段代码有些不了解: 你调用;而不使用其返回值 使用分配,;你不会修改原始传递的内容,并且你不会在此方法中使用它 你总是返回
当我在写这段代码时,我得到了一个编译时错误,它说:“lambdas中的变量必须是final或实际上是final”。
这个问题在这里已经有了答案: > 为什么匿名类只能访问最终变量? 为什么对于实例变量[重复]忽略“Lambda表达式中使用的变量必须是final或实际上是final”警告 “lambda在start方法参数被垃圾回收后才能运行”是什么意思? 为什么要复制?