Sar*_*ara 7 java collections java-8 java-stream collectors
有一个Person对象列表.
List<Person> persons = generatePersons();
使用它创建一个unmodifiableList.
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创建之前添加,因此上述观察.超级傻.
在你的第一种情况下,有人可以访问List<Person> unmodifiableList并可以编辑它,但是当你collect没有人可以访问List由此生成的Collectors.toList- 所以你很好.
您可能缺少的是Collectors::toList将创建一个新列表 - 这应该是显而易见的; 并将它包装成一个不可修改的,因此其结果是真正无法修改的.
同样在java-10中有特殊的收集器:
List<Integer> result = Arrays.asList(1, 2, 3, 4)
.stream()
.collect(Collectors.toUnmodifiableList());
Run Code Online (Sandbox Code Playgroud)
此收集器使用List::ofjava-9中添加的内部 - 不可变集合,因此例如它们不支持空值.
使用 Java10+,您可以使用内置功能copyOf来创建不可修改的列表,如下所示:
List<Person> persons = generatePersons();
List<Person> unmodifiableList = List.copyOf(persons);
Run Code Online (Sandbox Code Playgroud)
此外,您正在使用的当前列表Collector.collectingAndThen实际上也是不可变的,如文档中所述。
| 归档时间: |
|
| 查看次数: |
955 次 |
| 最近记录: |