e = e + "fff"); Syste-6ren">
gpt4 book ai didi

java - 无法更改parallelStream().forEach() 中的项目值?

转载 作者:太空宇宙 更新时间:2023-11-04 09:02:43 25 4
gpt4 key购买 nike

List<String> items = Arrays.asList("a", "b", "c");
items.parallelStream().forEach(e -> e = e + "fff");
System.out.println("case1 " + items);

items = items.parallelStream().map(e -> {
e = e + "fff";
return e;
}).collect(Collectors.toList());
System.out.println("case2 " + items);

为什么 case1 中的项目值没有改变?

如果 items 包含多个 DTO,而我只想更改 DTO 中的一个字段,那么必须使用 parallelStream().map().collect() 吗?为什么不能只使用parallelStream().forEach()?

最佳答案

forEach 使用者中的重新分配不会更改您的 items 列表引用的对象。所做的只是将 e 从引用列表元素更改为引用新字符串。

这将起作用,因为您正在更改对象而不是重新分配消费者参数的引用。

import java.util.Arrays;
import java.util.List;

public final class StackOverflow {

private static class ItemHolder<T> {
private T item;

ItemHolder(T item) {
this.set(item);
}

public void set(T item) {
this.item = item;
}

public T get() {
return item;
}

@Override
public String toString() {
return item.toString();
}
}

public static void main(String[] args) {
List<ItemHolder<String>> items = Arrays.asList(
new ItemHolder<>("a"),
new ItemHolder<>("b"),
new ItemHolder<>("c")
);

items.parallelStream().forEach(item -> {
String value = item.get();
item.set(value + "fff");
});

System.out.println(items);
}
}

打印:[afff, bfff, cfff]

关于java - 无法更改parallelStream().forEach() 中的项目值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60584581/

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