gpt4 book ai didi

java - Java 8 流是不可变的吗?

转载 作者:行者123 更新时间:2023-12-04 14:45:08 27 4
gpt4 key购买 nike

如果我的 API 提供流,客户端是否可以修改底层集合?

例如:

class ListWrapper {
List<String> myList;
...
Stream<String> getStream() {
return myList.stream();
}
}

客户端是否可以调用 listWrapper.getStream() 并以某种方式修改 myList 的内容?

最佳答案

流不能修改底层集合(如果集合本身没有公开),因此不能添加或删除元素,也不能更改顺序。当您在终端操作中使用流时,会构建一个新集合(但您可以将其收集到另一个现有集合中)。

但是,如果元素本身是可变的,流操作仍然可以修改单个元素。这是不好的做法,但可以做到。

例子:

class Item { public int x; public Item(int x) { this.x = x; } }
var list = List.of(new Item(1), new Item(2));
list.stream().peek(item -> item.x = 3).collect(toList());

当使用 collect(或 countforEach 或任何其他终端操作)消费流时,peek 回调将修改每个元素。运行上述代码后,您的列表将包含 2 个值为 x=3 的项目。 peek 是任意选择的非终端操作。使用 filtermap/flatMap 或任何其他非终端操作可以观察到相同的行为。

在本质上,这非常类似于:Is Java "pass-by-reference" or "pass-by-value"? ,但隐藏得更好。

关于java - Java 8 流是不可变的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62004870/

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