为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉莫斯之舞 2021-12-10 12:36:52
有一个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 的过程中迷失了方向。我怎样才能做到这一点?编辑:我Person在原始列表中添加了一个新对象persons并打印了persons列表和unmodifiablePersons. 两者都给我相同的大小。因此,更改正在反映到unmodifiablePersons,因此它还不是一成不变的。我在这里错过了什么吗?编辑 2愚蠢的。应该通过文档。unmodifiablePersons确实是一个不可变的列表。此外,新Person对象是在unmodifiablePersons创建之前添加的,因此上述观察结果。超级傻。
查看完整描述

1 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

那么在您的第一种情况下,有人可以访问List<Person> unmodifiableList并可以编辑它,但是当您collect没有人可以访问List生成的内容时Collectors.toList- 所以您很好。

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

同样在 java-10 中有一个特殊的收集器:

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

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


查看完整回答
反对 回复 2021-12-10
  • 1 回答
  • 0 关注
  • 182 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号