gpt4 book ai didi

java - 从 lambda 内部修改局部变量

转载 作者:IT老高 更新时间:2023-10-28 13:51:35 25 4
gpt4 key购买 nike

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 ordinal = new AtomicInteger(0);
list.forEach(s -> {
s.setOrdinal(ordinal.getAndIncrement());
});

... 或数组:

int[] ordinal = { 0 };
list.forEach(s -> {
s.setOrdinal(ordinal[0]++);
});

注意:如果您使用并行流,请务必小心。您可能不会得到预期的结果。其他解决方案,如 Stuart's可能更适合这些情况。

对于int以外的类型

当然,这对于 int 以外的类型仍然有效。

例如,对于 Java 10+:

var wrapper = new Object(){ String value = ""; };
list.forEach(s->{
wrapper.value += "blah";
});

或者,如果您被 Java 89 所困扰,请使用与我们在上面所做的相同类型的构造,但使用 AtomicReference ...

AtomicReference<String> value = new AtomicReference<>("");
list.forEach(s -> {
value.set(value.get() + s);
});

... 或数组:

String[] value = { "" };
list.forEach(s-> {
value[0] += s;
});

关于java - 从 lambda 内部修改局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30026824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com