如何最优实现Map<Faction, List<Resource>>到各阵营资源计数Map的转换
实现方案
Stream流式实现(最优推荐)
代码简洁易维护,符合Java 8+的最佳实践,核心逻辑一行流即可完成统计:
import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; // 入参为你原始存储的Map<Faction, List<Resource>>结构 public Map<Resource, Integer> countAllResources(Map<Faction, List<Resource>> factionResources) { return factionResources.values().stream() // 展开所有阵营的资源列表为统一的资源流 .flatMap(List::stream) // 按资源分组统计总数 .collect(Collectors.toMap( Function.identity(), // 键为资源枚举本身,如需字符串键替换为Resource::name r -> 1, // 每个资源初始计数为1 Integer::sum // 重复资源的计数累加 )); }
逻辑说明:无需单独循环处理每个阵营,直接提取所有阵营的资源列表做扁平化处理,一次性完成分组计数,性能和可读性都较好。
普通foreach循环实现
适合需要在统计过程中插入自定义业务逻辑、或者需要断点调试的场景:
import java.util.HashMap; import java.util.List; import java.util.Map; public Map<Resource, Integer> countAllResources(Map<Faction, List<Resource>> factionResources) { Map<Resource, Integer> countMap = new HashMap<>(); // 遍历所有阵营的资源列表 for (List<Resource> resourceList : factionResources.values()) { // 遍历单个阵营的所有资源 for (Resource res : resourceList) { // 累加对应资源的计数 countMap.put(res, countMap.getOrDefault(res, 0) + 1); } } return countMap; }
适配说明
如果你需要的返回键是资源的字符串名称而非枚举对象,只需要把对应代码里的键取值逻辑替换为res.name()即可,完全兼容你给出的目标输出格式。
内容的提问来源于stack exchange,提问作者comrade_adibit
相关产品推荐
相关产品推荐

