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

