You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java11如何将Tuple4列表转换为指定结构的嵌套Map

Java 11 嵌套分组转换实现方案

直接使用JDK自带的Stream API结合Collectors.groupingBy嵌套分组即可完成转换,以下是完整实现:

基础实现代码

假设你使用的Tuple4提供了getT1()/getT2()/getT3()/getT4()方法分别获取四个位置的元素(比如Vavr库的Tuple4实现),代码如下:

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
// 替换为你实际使用的Tuple4全类名,如Spring的Tuple、JOOQ的Record4等
import io.vavr.Tuple4;

public class TupleConvertService {
    public Map<String, Map<Boolean, Map<String, List<Integer>>>> convertTupleList(List<Tuple4<String, Boolean, String, Integer>> tupleList) {
        return tupleList.stream()
                // 第一层分组:取第一个String类型元素作为外层Map的key
                .collect(Collectors.groupingBy(
                        Tuple4::getT1,
                        // 第二层分组:取第二个Boolean类型元素作为中层Map的key
                        Collectors.groupingBy(
                                Tuple4::getT2,
                                // 第三层分组:取第三个String类型元素作为内层Map的key
                                Collectors.groupingBy(
                                        Tuple4::getT3,
                                        // 提取第四个Integer类型元素,收集为List
                                        Collectors.mapping(Tuple4::getT4, Collectors.toList())
                                )
                        )
                ));
    }
}

可选适配优化

保序版本实现

如果需要保留原始列表的分组顺序,方便后续按插入顺序写入ES,可以指定LinkedHashMap作为Map的实现类:

import java.util.LinkedHashMap;

public Map<String, Map<Boolean, Map<String, List<Integer>>>> convertOrderedTupleList(List<Tuple4<String, Boolean, String, Integer>> tupleList) {
    return tupleList.stream()
            .collect(Collectors.groupingBy(
                    Tuple4::getT1,
                    LinkedHashMap::new,
                    Collectors.groupingBy(
                            Tuple4::getT2,
                            LinkedHashMap::new,
                            Collectors.groupingBy(
                                    Tuple4::getT3,
                                    LinkedHashMap::new,
                                    Collectors.mapping(Tuple4::getT4, Collectors.toList())
                            )
                    )
            ));
}

ES写入场景适配

你得到的嵌套Map结构可以直接通过Jackson等JSON序列化工具转为JSON字符串写入ES,无需额外结构转换,可配合以下优化点适配ES规则:

  • 分组前添加filter过滤三个key为null的元素,避免ES出现空键异常
  • 如果需要对最终的Integer列表做聚合计算(如求和、取最大值),可将最后的Collectors.mapping替换为对应的聚合Collector,无需二次遍历

注意事项

如果你使用的是其他Tuple实现(比如Spring Data Tuple、JOOQ Record4),只需将代码中的getT1/getT2等取值方法替换为对应实现的取值逻辑即可,比如Spring Tuple的写法为t -> t.get(0, String.class)。

内容的提问来源于stack exchange,提问作者Shubhankar Agrawal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 00:54:04