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

Java Stream groupingBy分组后如何将Map转为List<Train>对象集合

实现方案

你可以通过两步完成转换:先按rateType分组,再遍历预定义的三类rateType生成Train对象,即可保证最终List固定包含3个元素,即使某类rateType没有对应数据也会返回带空列表的Train对象。

前提约定

假设Train类已提供全参构造方法:

public Train(String type, List<RateInfo> rateInfos) {
    this.type = type;
    this.rateInfos = rateInfos;
}

如果没有全参构造,可改用无参构造+setter方法赋值即可。

代码实现(固定返回3个元素,推荐)

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

// 预定义所有需要返回的rateType,顺序和要求的输出一致
private static final List<String> ALL_RATE_TYPES = List.of("AC", "general", "VIP");

public List<Train> rateInfoToTrainList(List<RateInfo> rateInfos) {
    // 1. 按rateType分组得到Map
    Map<String, List<RateInfo>> groupMap = rateInfos.stream()
            .collect(Collectors.groupingBy(RateInfo::getRateType));
    
    // 2. 遍历固定类型生成Train列表
    return ALL_RATE_TYPES.stream()
            .map(type -> new Train(
                    type,
                    groupMap.getOrDefault(type, List.of()) // 无对应分组时返回空列表
            ))
            .collect(Collectors.toList());
}

简化实现(仅返回存在数据的分组,不保证3个元素)

如果你不需要保留无数据的类型,可直接遍历分组后的Map生成结果:

public List<Train> rateInfoToTrainList(List<RateInfo> rateInfos) {
    return rateInfos.stream()
            .collect(Collectors.groupingBy(RateInfo::getRateType))
            .entrySet()
            .stream()
            .map(entry -> new Train(entry.getKey(), entry.getValue()))
            .collect(Collectors.toList());
}

无全参构造时的适配写法

如果Train只有无参构造,把map里的逻辑替换为setter赋值即可:

.map(type -> {
    Train train = new Train();
    train.setType(type);
    train.setRateInfos(groupMap.getOrDefault(type, List.of()));
    return train;
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:45:05