繁体   English   中英

如何构建一个新列表,其中包含现有列表中的所有条目以及修改了一个字段的每个条目的副本?

[英]How to build a new list containing all entries from existing list AND a copy of each entry with one field modified?

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

这就是我使用 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())
                        );

使用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);

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

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);

Output:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM