Java 8如何通过Streams实现列表按键分组同时拆分对应值
实现方案
首先确认ABC类已提供getName()、getVal()公共getter方法用于读取属性值。
方案1:Java 8+ Stream 流式写法(推荐,代码简洁)
import java.util.AbstractMap; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; // 核心逻辑 Map<String, List<String>> postsPerType = list.stream() // 将每个ABC对象的val字段拆分,映射为 <name, 单个val> 的键值对条目 .flatMap(abc -> Arrays.stream(abc.getVal().split(",")) .map(singleVal -> new AbstractMap.SimpleEntry<>(abc.getName(), singleVal))) // 按name分组,将同组的val收集为列表 .collect(Collectors.groupingBy( Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList()) ));
方案2:普通遍历写法(兼容JDK 8以下低版本)
import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; // 核心逻辑 Map<String, List<String>> postsPerType = new HashMap<>(); for (ABC item : list) { String name = item.getName(); String[] valArray = item.getVal().split(","); // 不存在对应name时先初始化列表 if (!postsPerType.containsKey(name)) { postsPerType.put(name, new ArrayList<>()); } // 把拆分后的所有val添加到对应列表 postsPerType.get(name).addAll(Arrays.asList(valArray)); }
可选优化
如果需要处理val为null、空字符串的异常场景,可在拆分前增加非空判断,比如将item.getVal().split(",")替换为Optional.ofNullable(item.getVal()).orElse("").split(","),避免空指针异常。
内容的提问来源于stack exchange,提问作者Devi
相关产品推荐
相关产品推荐

