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

前端之家收集整理的这篇文章主要介绍了java – 使用流从现有列表创建不可变列表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有一个Person对象列表.

列表与LT;人> persons = generatePersons();

使用它创建一个unmodifiableList.

列表与LT;人> unmodifiableList = Collections.unmodifiableList(persons);

我知道unmodifiableList不支持添加/删除/设置操作.同时它不是不可变的,因为它引用了现有的可修改列表人员,并且每当对人员列表进行更改时,更改也会反映在不可修改的列表中.

以这种方式创建不可变列表.

列表与LT;人> immutableList = Collections.unmodifiableList(new ArrayList<>(persons));

这会创建一个不可变列表,因为正在使用转换构造函数.不能对immutableList执行添加/删除/设置操作,也不会在immutableList中反映原始列表中的任何更改.
让我们假设Person对象也是不可变的.

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

第一个,我创建使用:

列表与LT;人> unmodifiablePersons = persons.stream()
.collect(Collectors.collectingAndThen(Collectors.toList(),Collections :: unmodifiableList));

我迷失在通过流创建等效的immutableList.

我怎样才能做到这一点?

编辑:

我向原始列表人员添加了一个新的Person对象,并打印了人员列表和不可修改的人员的大小.两者都给我相同的大小.
因此,变化正在反映到不可修改的角色,因此它不是一成不变的.我在这里错过了什么吗?

编辑2

愚蠢.本应该通过文档. unmodifiablePersons确实是一个不可变的列表.此外,在创建unmodifiablePersons之前添加了新的Person对象,因此进行了上述观察.超级傻.

解决方法

在第一种情况下,有人可以访问List< Person> unmodifiableList并且可以编辑它,但是当你收集时,没有人可以访问由Collectors.toList生成的那个List – 所以你很好.

您可能缺少的是Collectors :: toList将创建一个新的List – 这应该是显而易见的;并将它包装成一个不可修改的,因此其结果是真正无法修改的.

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

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

此收集器使用在java-9中添加的List :: of internal – immutable集合,因此例如它们不支持空值.

原文链接:https://www.f2er.com/java/129503.html

猜你在找的Java相关文章