Java 在lambda表达式中使用非final循环变量
我试图通过executors和runnable并行执行100个任务,任务需要使用循环变量: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)); } }); } 对我来说,这似乎不是最有效的解决方案,在每次迭代中声明一个新变量。有更好的方法吗?这是最简单的方法。你不会做得更好的 有
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表达式中看到,而不是在循环计数器中?同意。除非我们有一个utilIterable
-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();
}