在 lambda 表达式中使用非最终循环变量
Using the non final loop variable inside a lambda expression
我正在尝试通过执行器和可运行程序并行执行 100 个任务,该任务需要使用循环变量:
for (int i = 0; i < 100; i++) {
executor.execute(() -> {
doSomething(String.format("Need task number %d done", i));
}
});
}
我在 'i' 下看到一条波浪线 - 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));
}
});
}
这对我来说似乎不是最有效的解决方案,因为在每次迭代时都声明一个新变量。有更好的方法吗?
这是让它发挥作用的最直接的方法。你不会做得比这更好。
Is there a better way of doing this?
我怀疑。您的解决方案对我来说看起来不错,但如果您愿意,可以将其重写为可能更清晰的代码,例如:
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();
}
我正在尝试通过执行器和可运行程序并行执行 100 个任务,该任务需要使用循环变量:
for (int i = 0; i < 100; i++) {
executor.execute(() -> {
doSomething(String.format("Need task number %d done", i));
}
});
}
我在 'i' 下看到一条波浪线 - 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));
}
});
}
这对我来说似乎不是最有效的解决方案,因为在每次迭代时都声明一个新变量。有更好的方法吗?
这是让它发挥作用的最直接的方法。你不会做得比这更好。
Is there a better way of doing this?
我怀疑。您的解决方案对我来说看起来不错,但如果您愿意,可以将其重写为可能更清晰的代码,例如:
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();
}