如何使用Stream API将计数Map<Object,Integer>的数据收集为List<Object>
实现方案
核心逻辑是遍历Map的每一组键值对,将单个key按对应的计数展开为多个重复元素,最后合并为List即可,以下是兼容不同JDK版本的写法:
Java 8 及以上通用写法
使用IntStream.range生成指定次数的元素,兼容性最好:
import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.IntStream; // 假设你的Map变量名为nominalCountMap List<Nominal> result = nominalCountMap.entrySet().stream() // 每个键值对展开为 count 个重复的key .flatMap(entry -> IntStream.range(0, entry.getValue()) .mapToObj(i -> entry.getKey()) ) // JDK 16以下版本用Collectors.toList() .collect(Collectors.toList()); // JDK 16及以上可以直接用.toList(),得到的是不可变List // .toList();
Java 9 及以上简化写法
可以用Stream.generate更直观的生成重复元素:
import java.util.List; import java.util.Map; import java.util.stream.Stream; List<Nominal> result = nominalCountMap.entrySet().stream() .flatMap(entry -> Stream.generate(() -> entry.getKey()) .limit(entry.getValue()) ) .toList();
补充说明
- 如果你的Map是有序实现(比如
LinkedHashMap),生成的List会严格保留Map的键顺序,和示例输出的顺序完全一致;如果是HashMap需要固定排序,可以在entrySet().stream()后加sorted(Map.Entry.comparingByKey())按key排序即可。 - 如果计数可能存在null或者负数的情况,可以提前加过滤逻辑:
.filter(entry -> entry.getValue() != null && entry.getValue() > 0),避免出现异常或者冗余元素。
内容的提问来源于stack exchange,提问作者NeverSleeps
相关产品推荐
相关产品推荐

