【发布时间】:2019-03-31 11:48:46
【问题描述】:
有一个Person 对象列表。
List<Person> persons = generatePersons();
一个不可修改的列表是用它创建的。
List<Person> unmodifiableList = Collections.unmodifiableList(persons);
我了解unmodifiableList 不支持添加/删除/设置操作。同时它不是不可变的,因为它引用了现有的可修改列表persons,并且每当对persons 列表进行更改时,这些更改也会反映在unmodifiableList 中。
通过这种方式创建了一个不可变列表。
List<Person> immutableList = Collections.unmodifiableList(new ArrayList<>(persons));
这将创建一个不可变列表,因为正在使用转换构造函数。不能对 immutableList 执行添加/删除/设置操作,原始列表 persons 中的任何更改都不会反映在 immutableList 中。
让我们假设Person 对象也是不可变的。
现在,我想使用流创建这两个列表。
第一个,我使用以下方法创建的:
List<Person> unmodifiablePersons = persons.stream()
.collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList));
我迷失在通过流创建等效的 immutableList 。
我该怎么做?
编辑:
我在原始列表persons 中添加了一个新的Person 对象,并打印了persons 列表和unmodifiablePersons 的大小。两者都给我相同的尺寸。
因此,更改正在反映到unmodifiablePersons,因此它还不是一成不变的。我在这里遗漏了什么吗?
编辑 2
愚蠢。应该通过文档。 unmodifiablePersons 确实是一个不可变的列表。此外,在创建 unmodifiablePersons 之前添加了新的 Person 对象,因此上述观察结果。超级傻。
【问题讨论】:
-
你的例子是一个不可变的列表。事实上,这是文档给出的示例:docs.oracle.com/javase/8/docs/api/java/util/stream/…
-
@Zircon 我已经用我的观察更新了我的问题。请仔细查看。
-
@Sara 你不是 - 这确实是
List的 view -
建议通过 JDK 邮件列表中的 this discussion,同时实现
copy方法与收集器一起收集以设置、列出和映射。 -
@Zircon 已更新编辑 2。
标签: java collections java-8 java-stream collectors