gpt4 book ai didi

java - 使用流从现有列表创建不可变列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:11:18 26 4
gpt4 key购买 nike

有一个列表 Person对象。

List<Person> persons = generatePersons();

一个 unmodifiableList 是用它创建的。

List<Person> unmodifiableList = Collections.unmodifiableList(persons);

我明白 unmodifiableList不支持添加/删除/设置操作。同时它不是不可变的,因为它引用了现有的可修改列表 persons以及每当对 persons 进行更改时列表,更改反射(reflect)在 unmodifiableList 中也。

不可变列表就是这样创建的。

List<Person> immutableList = Collections.unmodifiableList(new ArrayList<>(persons));

由于使用了转换构造函数,因此创建了一个不可变列表。无法对 immutableList 执行添加/删除/设置操作原始列表也没有任何变化 persons会反射(reflect)在 immutableList .让我们假设 Person对象也是不可变的。

现在,我想使用流创建这两个列表。

第一个,我创建使用:

List<Person> unmodifiablePersons = persons.stream()
.collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList));

我迷失了通过流创建 immutableList 的等价物。

我该怎么做?

编辑:

我添加了一个新的 Person反对原始列表persons并打印出 persons 的尺寸列表和 unmodifiablePersons .两者都给我相同的尺寸。因此,更改会反射(reflect)到 unmodifiablePersons因此它还不是一成不变的。我在这里遗漏了什么吗?

编辑2

愚蠢。应该通过文档。 unmodifiablePersons确实是一个不可变列表。此外,新的 PersonunmodifiablePersons 之前添加对象被创建并因此出现上述观察结果。 super 傻。

最佳答案

在你的第一个案例中,某人可以访问 List<Person> unmodifiableList并且可以编辑它,但是当你collect没有人可以访问那个ListCollectors.toList 生成- 所以你很好。

您可能缺少的是 Collectors::toList将创建一个 列表——这应该是显而易见的;然后你把它包装成一个不可修改的,因此它的结果是真正不可修改的。

在 java-10 中也有专门的收集器:

List<Integer> result = Arrays.asList(1, 2, 3, 4)
.stream()
.collect(Collectors.toUnmodifiableList());

此收集器使用 List::of内部 - java-9 中添加的不可变集合,因此例如它们不支持空值。

关于java - 使用流从现有列表创建不可变列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53013435/

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