Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在lambda表达式中使用非final循环变量_Java_Lambda_Final_Executorservice - Fatal编程技术网

Java 在lambda表达式中使用非final循环变量

Java 在lambda表达式中使用非final循环变量,java,lambda,final,executorservice,Java,Lambda,Final,Executorservice,我试图通过executors和runnable并行执行100个任务,任务需要使用循环变量: for (int i = 0; i < 100; i++) { executor.execute(() -> { doSomething(String.format("Need task number %d done", i)); } }); } 对我来说,这似乎不是最有效的解决方案,在每次迭代中声明一个新变量。有更好的方法吗?这是最简单的方法。你不会做得更好的 有

我试图通过executors和runnable并行执行100个任务,任务需要使用循环变量:

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

对我来说,这似乎不是最有效的解决方案,在每次迭代中声明一个新变量。有更好的方法吗?

这是最简单的方法。你不会做得更好的

有更好的方法吗

我对此表示怀疑。我觉得您的解决方案很好,但如果您愿意,可以将其重写为可能更清晰的代码,如:

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

将lambda表达式代码包装到方法中,并将该方法调用到循环中。这种方式是标准的lambda表达式可维护代码

for(int i=1;i<=6;i++){  doSomeThing(i); }


static void doSomeThing(int i)
    { Thread loop=new Thread(()->{print(i);}); // jvm point of view is final
        loop.setPriority(Thread.MIN_PRIORITY);
        loop.start();
    }
for(inti=1;i{print(i);});//jvm的观点是最终的
loop.setPriority(Thread.MIN_PRIORITY);
loop.start();
}

这是一个局部变量,所以我认为它实际上不是matters@ka4eli-同意。就性能而言,这并不重要。JVM很可能只是删除它并直接使用
i
。为了程序员的利益,有效的最终需求只能由javac实现。运行时只捕获当前值。@bayou.io非常有趣,我没有想到JVM优化。我只是遇到了同样的问题并使用了同样的解决方案。:)那么为什么索引可以在lambda表达式中看到,而不是在循环计数器中?同意。除非我们有一个util
Iterable
-
for(inti:range(01100))
-这里的
i
将是有效的最终结果。这既简洁又优秀。我要用它。非常感谢。
for(int i=1;i<=6;i++){  doSomeThing(i); }


static void doSomeThing(int i)
    { Thread loop=new Thread(()->{print(i);}); // jvm point of view is final
        loop.setPriority(Thread.MIN_PRIORITY);
        loop.start();
    }