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
相关产品推荐
相关产品推荐

