当前位置: 首页 > 知识库问答 >
问题:

为什么forEach循环中的变量不能更改?

敖子安
2023-03-14

我正在迭代Java 7循环和Java 8 forEach循环中的列表。Java 8 循环希望其中的变量不会更改。例如:

List<String> testList = Arrays.asList( "apple", "banana", "cat", "dog" );
int count = 0;

testList.forEach(test -> {
  count++; // Compilation error: Local variable count defined in an enclosing scope must be final or effectively final
});

for (String test : testList) {
  count++; // Code runs fine
}

有人能解释一下为什么吗?是Java 8的弊端吗?

共有1个答案

洪季萌
2023-03-14

Java内存模型有一个非常重要的特性:它保证局部变量和方法参数永远不会被另一个线程写入。这增加了多线程编程的安全性。然而,当您创建lambda(或匿名类)时,没有人知道它将如何使用。它可以传递给另一个线程执行(例如,如果使用<code>parallelStream().forEach(…))。如果有可能修改局部变量,则会违反重要属性。这不是Java语言开发人员会牺牲的东西。

通常,当您使用lambda时,您会尝试以函数式方式进行编程。但是在函数式编程中,可变变量被认为是不好的做法:最好只给每个变量分配一次。所以尝试修改局部变量实际上很有味道。使用各种流缩减方法而不是foreach来生成一个好的函数代码。

 类似资料:
  • 我是codeigniter的初学者,我正在制作一个用于学习的基本积垢。我在索引中遇到了一个错误。php 遇到PHP错误严重性:注意:消息:未定义变量:posts 文件名:posts/index。php 行号:2 回溯: 文件:/opt/lampp/htdocs/codeigniter/application/views/posts/index。php 行:2 函数:\u错误\u处理程序 文件:/o

  • 我想知道为什么这个函数中的foreach循环在只经过一次循环后输出数据就结束了。我在MySQL中运行了这个查询,它返回了我要查找的8条记录。当I

  • 在我的程序中,我发现当为时,循环无法正确退出。它看起来像整数溢出,远远大于10,循环不会停止。请告诉我发生了什么,以及如何在大型项目中避免这个错误。 代码链接

  • 我可以打印最大罚款,但我不能打印计数。我看不出max和count之间的区别,也看不出为什么它不让我打印count。感谢任何帮助

  • 问题内容: 如果我有一个数字列表,并且想使用for循环将其递增,那为什么不起作用: 我期望得到[2,3,4,5,6]。 我知道我可以通过解决这个问题 但是必须有一种更简单的方法。 问题答案: 这是因为您仅获得列表中变量的引用。替换它时,只需更改该引用指向的内容,因此列表中的项目保持不变。对此的最佳解释是直观地进行跟踪-逐步执行该链接处的执行可视化,并且应该非常清楚。 请注意,可变对象可以在适当位置

  • 我尝试用forEach循环遍历一个包含三个变量的数组,并将每个变量的值更改为0-255之间的随机数。 我首先给每个变量一个简单的值: