我有一个List<Object[]>,其中Object[]的大小是3,来自一个查询.查询结果如下:

| vehicleId                          | modelId | serviceId       |
|------------------------------------|---------|-----------------|
|93bf3e92-7a37-4e23-836d-eed5a104341f|      214|80a7-ce5640b18879|    
|b4066520-e127-44b7-bcc0-1d1187de559c|      214|80a7-ce5640b18879|
|ae6cb0fe-1501-4311-a2b4-cfb8b4f51ca4|      214|80a7-ce5640b18879|
|cf80ff11-6e23-4c19-8b6d-55d34d131566|      214|80a7-ce5640b18879|

它应该映射到下面的列表中.第二列和最后一列将映射到modelId和serviceId,而第一列应成为VehicleID列表.

我需要将其映射到List<MyDTO>,其中MyDTO如下所示:

MyDTO{

// constructor    
MyDTO(String modelId, String serviceId, List<String> vehicleIds){...}

String modelId;
String serviceId;
List<String> vehicleIds;
}

我正试图弄清楚如何在一条小溪中分组,但似乎什么也没说出来.这就是我被封锁的地方...

listOfObjectArrays.stream()
            .map(objects -> new MyDTO((String) objects[0], (String) objects[1], null));

不知道如何应用reduce操作来完成这项工作,非常感谢您的帮助!

Edit:

推荐答案

通过使用groupingBy()mapping()采集器将数据按modelId分组,然后按serviceId分组,可以创建嵌套的中间映射.

然后在条目集上创建一个流.并根据modelIdserviceId的每个组合展平每个内部贴图,创建new MyDTO.

Map<String, Map<String, List<String>>> vehicleIdByModelIdAndServiceId =
    listOfObjectArrays.stream()
        .collect(Collectors.groupingBy(objects -> (String) objects[1],
            Collectors.groupingBy(objects -> (String) objects[2],
                Collectors.mapping(objects -> (String) objects[0],
                    Collectors.toList()))));
        
List<MyDTO> result = vehicleIdByModelIdAndServiceId.entrySet().stream()
        .flatMap(baseEntry -> baseEntry.getValue().entrySet().stream()
                    .map(entry -> new MyDTO(baseEntry.getKey(), entry.getKey(), entry.getValue())))
        .collect(Collectors.toList());

另一个选项是在中间映射中使用Map.Entry作为键,值将是vehicleId的列表.

List<MyDTO> result = listOfObjectArrays.stream()
        .collect(Collectors.groupingBy(objects -> new AbstractMap.SimpleEntry<>((String) objects[1], (String) objects[2]),
                Collectors.mapping(objects -> (String) objects[0],
                    Collectors.toList())))
        .entrySet().stream()
        .map(entry -> new MyDTO(entry.getKey().getKey(),
                                entry.getKey().getValue(),
                                entry.getValue()))
        .collect(Collectors.toList());

Java相关问答推荐

查找最大子数组的和

为什么Java中的两个日期有差异?

我无法将附件发送到NetBeans之外

对某一Hyroby控制器禁用@cacheable

所有 case 一起输入时输出错误,而单独放置时输出正确

如何获得执行人?

FALSE:它应该在什么时候使用?

是否在允许数组元素为空时阻止 idea 为空性警告?

使用Mockito进行的Junit测试失败

Arrays.hashcode(int[])为不同的元素提供相同的散列

如何将Pane的图像快照保存为BMP?

Java泛型类方法的静态返回类型是否被类型擦除?

无法使用Freemarker从XML中读取重复的标记值

Dijkstra搜索算法的实现

将stringBuilder + forloop转换为stream + map

接受类及其接口的Java类型(矛盾)

在WHILE()循环初始化部分中声明和初始化变量的Java语法?

Java 21保护模式的穷尽性

为什么方法接受协变类型的匿名泛型类对象?

为什么 static Thread.currentThread().getName() 和 getName() 之间有区别?