当前位置: 首页 > 面试题库 >

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

满雨石
2023-03-14
问题内容

有一个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没有人可以访问ListCollectors.toList-
生成的内容时,那么您就很好。

您可能缺少的是Collectors::toList将创建一个 列表-这应该很明显;并且将其包装为不可修改的文件,因此其结果是真正不可修改的。

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

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

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



 类似资料:
  • 我有一个列表,我想创建一个名为的扩展。 我不想覆盖,因此不能使用append、extend或insert。我想知道是否有一个快速的方法来完成这项工作(比使用理解列表或Deep.copy更快)

  • 我有一个学生名单a和学生名单B。 学生对象包含如下字段:否、年龄、城市、出生日期、工资 我的列表A包含这些对象 我的列表B包含这些对象 我想做的是提取ListA有但listB没有的学生对象,以及ListA和listB有但薪水不同的学生对象(如否、年龄、城市)。我还想写工资差异。 我想在java 8中使用流api。首先,我想将students对象提取到列表中,但我现在可以提取常见的student对象

  • 问题内容: 当我们使用数组从数组创建列表时,该列表是不可变的。我只是想知道为什么当(或)的基本目的是具有动态大小并能够随意添加和删除元素时,为什么要创建一个不可变列表。当我们需要固定大小的数据结构时,我们选择数组;当我们需要动态数据结构时,我们选择或或等等。那么拥有不可变列表的目的是什么?我在做作业时遇到了这个问题。 问题答案: 当我们使用java.util.Arrays.asList()从数组创

  • 我需要将可变列表对象转换为不可变列表。java中可能的方法是什么?

  • 我有一个的数组,它们都有一个的列表: 我想创建一个包含所有变量的列表。我今天是这样做的: 我尝试过此操作,但它返回给我一个,而我想要一个,其中附加了列表的所有元素(使用):

  • 问题内容: 我有一个应用程序,该应用程序可以获取制造过程的质量结果,并创建图形以显示不良品的帕累托图,并显示生产量。 为了自动化测试这些统计程序的任务,我希望确定性地能够将记录添加到数据库中,并使质量技术能够进入某些图表并与已知的良好图表进行比较。但是,我也想模拟结果,以便将它们像进入用户整个测试过程一样进入数据库。 我有一个想法是用i好的数字,j的坏数字1,k的坏数字2等填充一个列表,然后以某种