【问题标题】:How to build a new list containing all entries from existing list AND a copy of each entry with one field modified?如何构建一个新列表,其中包含现有列表中的所有条目以及修改了一个字段的每个条目的副本?
【发布时间】:2021-04-12 14:07:32
【问题描述】:

我有一个名为列表的对象列表。使用 list.stream(),我需要创建一个相同对象的新列表,其中新列表包含所有原始条目,并且新列表包含每个条目的副本,其中一个字段已修改。我知道如何使用 list.stream() 两次,但我想在 1 个流下进行。

这就是我使用 list.stream() 两次完成任务的方式

         newList = list.stream().collect(Collectors.toList());
         newList.addAll(list.stream().map(l -> {SomeObject a = new SomeObject(l);
                              a.setField1("New Value");
                              return a;
                              }).collect(Collectors.toList())
                        );

【问题讨论】:

    标签: java list java-8 stream


    【解决方案1】:

    使用flatMap(假设您不介意交错的原始值和派生值):

    newList = list.stream()
        .flatMap(l -> {
          SomeObject a = new SomeObject(l);
          a.setField1("New Value");
          return Stream.of(l, a);
        })
        .collect(toList());
    

    如果只是不想使用stream() 两次,则可以避免使用addAll 的第一次;第二个是不必要的collect

    newList = new ArrayList<>(list.size() * 2);
    newList.addAll(list);
    list.stream()
        .map(l -> {
            SomeObject a = new SomeObject(l);
            a.setField1("New Value");
            return a;
        })
        .forEach(newList::add);
    

    【讨论】:

    • flatMap 解决方案是我正在寻找的,但无法弄清楚要返回什么才能使其工作。谢谢。
    【解决方案2】:

    如果你想要对象然后处理对象等等,那么在你的新列表中,你可以尝试这样的事情:

    List<String> list = List.of("a", "b", "c" );
            
    List<String> answer = list.stream()
                 .map(s -> List.of(s,s+"1"))
                 .flatMap(List::stream).collect(Collectors.toList());
            
    System.out.println(answer);
    

    输出:

    [a, a1, b, b1, c, c1]
    

    【讨论】:

      猜你喜欢
      • 2020-03-24
      • 2020-01-14
      • 2021-11-06
      • 1970-01-01
      • 2016-05-18
      • 2018-04-17
      • 2017-05-04
      • 1970-01-01
      • 2017-11-10
      相关资源
      最近更新 更多