我有一个带有嵌套列表字段的DTO个对象的列表.

目标是通过id字段和merge字段将它们group,然后使用Streams API将列表sort.

class DTO {
    private Long id;
    private List<ItemDTO> items;
}

class ItemDTO {
    private Long priority;
    private Long value;
}

// input
List<DTO> dtoList = List.of(
 DTO(1, List.of(ItemDTO(1, 1), ItemDTO(7, 2))),
 DTO(2, List.of(ItemDTO(1, 1), ItemDTO(2, 2))),
 DTO(1, List.of(ItemDTO(10, 3), ItemDTO(1, 4)))
);

我需要用相同的id字段group这些嵌套对象,用字段priority102merge所有项.

dtoList个项目的最终结果如下:

// output 
List<DTO> resultList = [
        DTO(1, List.of(ItemDTO(10,3), ItemDTO(7,2), ItemDTO(1,1), ItemDTO(1,4)),
        DTO(2, List.of(ItemDTO(2,2), ItemDTO(1,1),
    ];

我们可以通过Streams API实现这一点吗?

推荐答案

我将从一个简单的分组开始,以获得一个映射Map<Long,List<DTO>>,并对该映射的条目进行流式处理,然后将每个条目映射到一个新的DTO.您可以提取一个方法/函数来对ItemDTO进行排序:

import java.util.Comparator;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

....


Function<List<DTO>, List<ItemDTO>> func =
        list -> list.stream()
                .map(DTO::getItems)
                .flatMap(List::stream)
                .sorted(Comparator.comparing(ItemDTO::getPriority,Comparator.reverseOrder()))
                .collect(Collectors.toList());

List<DTO> result = 
        dtoList.stream()
               .collect(Collectors.groupingBy(DTO::getId))
               .entrySet().stream()
               .map(entry -> new DTO(entry.getKey(), func.apply(entry.getValue())))
               //.sorted(Comparator.comparingLong(DTO::getId)) if the resulting list need to be sorted by id
               .collect(Collectors.toList());

Java相关问答推荐

OpenJDK、4K显示和文本质量

如何在访问完所有文件后加入所有线程?

为什么Java的代码工作(if condition内部的实例)

连接Quarkus中的两个异步操作

Spark忽略Iceberg Nessie目录

试着做一个2x2的魔方求解算法,我如何找到解路径(DFS)?

我如何知道MediaDiscoverer何时完成发现介质?

有没有更快的方法在N个容器中删除重复项?

Tinylog中的滚动文件会在每次应用启动时覆盖日志(log)文件

如何从日期中截取时间并将其传递给组件?

在向WebSphere中的文档添加元素时iText挂起

如何仅使用键/ID的一部分(组合)高效地返回映射值?

A.ForEach与For(类型a:集合)

JavaFX:为什么我的ComboBox添加了一个不必要的单元格的一部分?

在具有Quarkus Panache的PostgreSQL中将JSON数据存储为JSONB时,会将其存储为转义字符串

如何使用Hibernate v6.2构建NamingStrategy,以表名作为所有列的前缀?

使用Java线程进行并行编程

JavaFX中ListView中的问题

双对象供应商

java中的网上购物车解析错误