Java如何将List<List<Object>>转换为按字段去重的嵌套列表
问题说明
需要对List<List<Object>>类型的二维结构化数据做格式转换,按列维度提取每列的去重值,最终组装为新的List<List<Object>>结构。
测试输入
List<List<Object>> data = new ArrayList<>(); List<Object> list1 = new ArrayList<>(); List<Object> list2 = new ArrayList<>(); List<Object> list3 = new ArrayList<>(); List<Object> list4 = new ArrayList<>(); List<Object> list5 = new ArrayList<>(); List<Object> list6 = new ArrayList<>(); list1.add("Siva"); list1.add("20"); list1.add("Hyd"); list1.add("India"); list2.add("Siva"); list2.add("22"); list2.add("Banglore"); list2.add("India"); list3.add("Ramesh"); list3.add("22"); list3.add("Chennai"); list3.add("India"); list4.add("Ramesh"); list4.add("24"); list4.add("Kochi"); list4.add("US"); list5.add("Suresh"); list5.add("25"); list5.add("Chennai"); list5.add("UK"); list6.add("Suresh"); list6.add("24"); list6.add("Hyd"); list6.add("UK"); data.add(list1); data.add(list2); data.add(list3); data.add(list4); data.add(list5); data.add(list6);
输出规则
- 输出结构为
List<List<Object>> - 按原始数据的列顺序,依次提取姓名、年龄、城市、国家四列的所有取值
- 每列取值需去重,保留值首次出现的顺序
期望输出
[[Siva,Ramesh,Suresh],[20,22,24,25],[Hyd,Banglore,Chennai,Kochi],[India,US,UK]]
实现方案
基于Java 8 Stream原生API实现,无第三方依赖,代码简洁且自动保留取值顺序:
import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream; public class ColumnDistinctConverter { public static List<List<Object>> extractColumnDistinctValues(List<List<Object>> source) { // 空值校验,兼容边界场景避免空指针 if (source == null || source.isEmpty() || source.get(0).isEmpty()) { return Collections.emptyList(); } int columnNum = source.get(0).size(); // 逐列提取值并去重 return IntStream.range(0, columnNum) .mapToObj(colIndex -> source.stream() .map(row -> row.get(colIndex)) .distinct() // 基于equals判断重复,默认保留元素首次出现顺序 .collect(Collectors.toList()) ) .collect(Collectors.toList()); } }
逻辑说明
- 入参阶段做空值判断,空输入直接返回空列表,避免运行时异常
- 通过列索引遍历所有列,替代传统多层for循环的冗余写法
distinct()方法去重逻辑完全匹配需求,不需要手动实现顺序保留逻辑- 所有实现基于JDK原生API,兼容性强,可以直接嵌入业务代码使用
内容的提问来源于stack exchange,提问作者Satish Jajimoggala
相关产品推荐
相关产品推荐

