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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:27:04