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

在lambda表达式中使用非最终循环变量

狄玮
2023-03-14
问题内容

我试图通过执行程序和可运行程序并行执行100个任务,该任务需要使用循环变量:

for (int i = 0; i < 100; i++) {
   executor.execute(() -> {
     doSomething(String.format("Need task number %d done", i));
   }
  });
}

我在“我”的语气中a不休- Variable used in lambda expression should be effectively final.

据我所知,由于每次迭代都会更改循环变量,因此无法使其成为最终变量或有效地成为最终变量。我找到了一个简单的解决方法,

for (int i = 0; i < 100; i++) {
   int index = i;
   executor.execute(() -> {
     doSomething(String.format("Need task number %d done", index));
   }
 });
}

在我看来,这并不是最有效的解决方案,因为每次迭代都要声明一个新变量。有更好的方法吗?


问题答案:

有更好的方法吗?

我对此表示怀疑。您的解决方案对我来说看起来不错,但是如果您愿意,可以将其重写为可能更清晰的代码,例如:

IntStream.range(0, 100).forEach(
    i -> executor.execute(
        () -> doSomething(String.format("Need task number %d done", i))
    )
);


 类似资料:
  • 如何在Java 8 lambda中使用非final变量。它抛出编译错误,称“封闭范围中定义的局部变量日期必须是final或实际上是final” 我实际上想实现以下目标: 如何实现此目的?它会为 date2 引发 comilation 错误。谢谢

  • 问题内容: 最近,我发现匿名类和lambda表达式之间有细微的区别: 通常,lambda与匿名类等效。甚至我的Eclipse IDE都具有重构功能,可以将转换为lambda(变得完全像)并转换为匿名类(变得完全像)。但是lambda给了我一个编译错误,而匿名类却可以完美地编译。错误消息如下所示: 所以问题是:为什么会有这种差异? 问题答案: 这与处理前向引用的JLS#8.3.3有关。特别是,如果使

  • 问题内容: 我试图通过使用Runnable接口包装我需要的任何函数来简单地计时一个函数。 那么我可以简单地执行以下操作: 但是,如果我有一个带有参数的函数,则必须将其修改为: 我遇到的问题是’someParameter’必须是final或有效的final。有没有解决此问题的方法?我见过forEach的循环,但是我需要将此参数从1、10、100->指数化直到满足条件。代码是这样的: 我要求funct

  • 问题内容: 如果我列出两个函数列表: 为什么名单,并没有保存的行为方式? 例如: 问题答案: 从技术上讲,lambda表达式是在全局范围(最后设置为9)中可见的那一端 关闭的 。在所有10个lambda中都引用 相同的内容 。例如, __ 在函数中,lambda在调用函数时关闭。那是十个 不同 的。

  • 问题内容: java中是否允许这样做: 我的问题的关键词是。是否可以允许最终变量随循环的每次运行而变化?我想知道这是因为final说您不能更改变量的值(仅调用),但是我正在使用重新定义整个变量。 它们是两个完全不同的变量,只是具有相同的名称-循环的前一次运行中的变量已经朝着垃圾收集器的方向前进了吗? 问题答案: 是的,允许。该关键字意味着你不能改变的变量的值 的范围之内 。对于循环示例,您可以认为

  • 我正在尝试从pojo创建一个函数,该函数在以下意义上使用细节类值的求和: 但是不知道为什么这一行< code > sum = sum . add(detail . getvalue());引发此错误: 从lambda表达式引用的局部变量必须是final或有效final 你能告诉我我做错了什么吗?谢了。