从Lambda内部修改局部变量
修改中的局部变量forEach
会产生编译错误:
int ordinal = 0; for (Example s : list) {
s.setOrdinal(ordinal);
ordinal++;
}
int ordinal = 0; list.forEach(s -> {
s.setOrdinal(ordinal);
ordinal++;
});
任何想法如何解决这个问题?
回答:
使用包装纸
任何一种包装纸都是好的。
对于
,请使用AtomicInteger
:
AtomicInteger ordinal = new AtomicInteger(0);list.forEach(s -> {
s.setOrdinal(ordinal.getAndIncrement());
});
…或数组:
int[] ordinal = { 0 };list.forEach(s -> {
s.setOrdinal(ordinal[0]++);
});
使用 :
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内部修改局部变量 的全部内容, 来源链接: utcz.com/qa/404171.html