修改中的局部变量forEach
会产生编译错误:
正常
int ordinal = 0;
for (Example s : list) {
s.setOrdinal(ordinal);
ordinal++;
}
与Lambda
int ordinal = 0;
list.forEach(s -> {
s.setOrdinal(ordinal);
ordinal++;
});
任何想法如何解决这个问题?
任何一种包装纸都是好的。
对于 Java 8+
,请使用AtomicInteger
:
AtomicInteger ordinal = new AtomicInteger(0);
list.forEach(s -> {
s.setOrdinal(ordinal.getAndIncrement());
});
…或数组:
int[] ordinal = { 0 };
list.forEach(s -> {
s.setOrdinal(ordinal[0]++);
});
使用 Java 10+ :
var wrapper = new Object(){ int ordinal = 0; };
list.forEach(s -> {
s.setOrdinal(wrapper.ordinal++);
});
注意: 如果使用并行流, 请 非常小心。您可能无法获得预期的结果。诸如Stuart的其他解决方案可能更适合这些情况。
int
当然,这对于之外的其他类型仍然有效int
。您只需要将包装类型更改为AtomicReference
或该类型的数组即可。例如,如果您使用String
,只需执行以下操作:
AtomicReference<String> value = new AtomicReference<>();
list.forEach(s -> {
value.set("blah");
});
使用数组:
String[] value = { null };
list.forEach(s-> {
value[0] = "blah";
});
或使用Java 10+:
var wrapper = new Object(){ String value; }
list.forEach(s->{
wrapper.value = "blah";
});
在中修改局部变量会导致编译错误: 典型的 和Lambda 你知道怎么解决这个问题吗?
假设我有一个和一个。我想将每个变压器应用于列表中的每个字符串。 使用Java8 lambdas,我可以这样做: 但我想做更像这样的事情,但这会导致编译时错误: 我刚刚开始玩lambdas,所以也许我只是没有正确的语法。
问题内容: 为什么我需要声明一个方法,好像我在方法中定义的需要使用它一样? 范例: } 为什么String 需要是最终常量?它如何影响? 问题答案: 答案是两者在不同的范围内。因此该变量可以在内部类访问它之前更改。将其最终确定可以防止这种情况。
为什么<code>test
但是,如果我在内部类中声明了一个同名的variabe呢?有什么方法可以显式引用外部变量吗? 顺便说一句,这和这个问题不同,因为它考虑的是局部堆栈变量。