修改局部变量forEach会产生编译错误:
forEach
普通的
int ordinal = 0; for (Example s : list) { s.setOrdinal(ordinal); ordinal++; }
使用 Lambda
int ordinal = 0; list.forEach(s -> { s.setOrdinal(ordinal); ordinal++; });
知道如何解决这个问题吗?
任何一种包装都很好。
在 Java 10+ 中,使用这个结构,因为它很容易设置:
var wrapper = new Object(){ int ordinal = 0; }; list.forEach(s -> { s.setOrdinal(wrapper.ordinal++); });
在 Java 8+ 中,使用以下任一AtomicInteger:
AtomicInteger
AtomicInteger ordinal = new AtomicInteger(0); list.forEach(s -> { s.setOrdinal(ordinal.getAndIncrement()); });
…或一个数组:
int[] ordinal = { 0 }; list.forEach(s -> { s.setOrdinal(ordinal[0]++); });
注意: 如果您使用并行流,请务必小心。您可能不会得到预期的结果。像Stuart 的其他解决方案可能更适合这些情况。
int
当然,这对于除int.
例如,对于 Java 10+ :
var wrapper = new Object(){ String value = ""; }; list.forEach(s->{ wrapper.value += "blah"; });
或者,如果您对 Java 8 或 9 感到困惑,请使用与我们在上面所做的相同类型的构造,但使用AtomicReference…
AtomicReference
AtomicReference<String> value = new AtomicReference<>(""); list.forEach(s -> { value.set(value.get() + s); });
String[] value = { "" }; list.forEach(s-> { value[0] += s; });