当前位置: 首页 > 面试题库 >

为什么lambda中的变量必须是最终变量或有效最终变量?[重复]

杨海
2023-03-14
问题内容

这个问题已经在这里有了答案

为什么在匿名类中只能访问最终变量? (15个答案)

为什么实例变量“忽略Lambda表达式中使用的变量必须是最终变量或实际上是最终变量”警告[重复]

(2个答案)

Lambdas:局部变量不需要最终变量,实例变量不需要 (10个答案)

2年前关闭。

当我编写此代码时,我收到一个编译时错误,该错误是: “ lambda中的变量必须是final或有效的final”

现在,我从行中删除了 i

futureLists.add(executorService.submit(()- >“ Hello world” + i));

解决了这个问题。

但是我想知道为什么存在这样的要求?

根据JLS,它只表示:

使用但未在lambda表达式中声明的任何局部变量,形式参数或异常参数必须声明为final或有效地为final,否则在尝试使用时会发生编译时错误。

但是它没有说明为什么存在这样的要求。但是,为什么Java工程师对lambda强制执行这样的要求?

public class test {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
         ExecutorService executorService = Executors.newFixedThreadPool(10);

         List<Future<String>> futureLists = new ArrayList<>();

         for (int i = 0; i < 20; i++) {
             futureLists.add(executorService.submit( () -> "Hello world" + i));
             }

         for (Future<String> itr:futureLists) {
             System.out.println(itr.get());
            }
       }
   }

问题答案:

它与多线程编程有关。

到目前为止,Java中的局部变量不受竞争条件和可见性问题的影响,因为它们只能由执行声明它们的方法的线程访问。但是可以将lambda从创建它的线程传递到另一个线程,因此,如果第二个线程评估的lambda具有对局部变量进行突变的能力,则其免疫力将因此丧失。-
来源



 类似资料:
  • 在Java8中,Java设计者提出了一个有效的final变量的概念,即一个如果被“final”追加就不会给编译器带来错误的变量。我的问题是,这个新提出的“有效最终”概念比经典的“最终”提供了什么?作为一名Java开发人员,我实际上得到了什么好处?

  • 问题内容: 例如,如果我有一个变量,并且在主线程中声明了一个runnable,并且想将x传递给该runnable的方法,则必须对其进行声明。为什么? 问题答案: 因为如果能够更改它们,可能会导致很多问题,请考虑以下事项: 这是一个粗略的示例,但您可以看到可能发生许多无法解释的错误。这就是变量必须为最终变量的原因。这是解决上述问题的简单方法: 如果您需要更完整的说明,则有点像同步。Java希望防止您

  • 问题内容: 我读了这个问题不可变对象,并留下了关于不可变对象,并最终场一个问题: 为什么我们需要不可变类中的实例变量为最终变量? 例如,考虑以下不可变的类: 如果在上面的代码中没有set方法,而实例变量仅在构造函数中设置,为什么要求将实例变量声明为final? 问题答案: 有没有 要求 这样做的变量。但是,当您确实明确打算永远不更改变量时,通常这样做是一种好习惯,因为这不仅可以使变量避免错别字或其

  • 我正在研究java 8流,我唯一的问题是理解lambdas为什么lambdas中的有效最终警告会被忽略,例如(和静态)变量。我似乎在网上找不到任何对它的引用,因为大多数页面只会谈论“有效最终”的定义。

  • 这个程序是我的类的最终赋值,我在弄清楚为什么我收到错误“从内部类引用的局部变量必须是最终的或实际上是最终的”时遇到了问题。该程序正在运行并发线程来对#的数组进行排序,然后找到该数组的高值和低值。当我在没有并发的情况下创建它时,我没有这个错误。我正在努力确定在哪里最终确定高变量和低变量。 这是产生错误的代码块。如果我使int高=数字[0];或int-low=数字[0];final,然后我得到一个错误

  • 问题内容: 6年前关闭。 有关匿名类的文档说明 匿名类无法在其封闭范围内访问未声明为final或有效地为final的局部变量。 我不明白变数为“有效的最终”是什么意思。有人可以提供一个示例来帮助我理解这意味着什么吗? 问题答案: 有效地最终意味着它在获得初始值之后永远不会改变。 一个简单的例子: 在这里,并没有声明为final,但是由于它从未更改,因此实际上被认为是 final 。 从Java 8