如何基于ImmutableListMultimap值调用已有函数且不修改该函数?
问题描述
现有如下函数:
ImmutableMap<String, ImmutableList<ImpactSummary>> toSummariesByKey(ImmutableMap<String, ImmutableList<Impact>> impactsByKey) { return impactsByKey.entrySet().stream() .collect( toImmutableMap( entry -> entry.getKey(), entry -> helper(entry.getValue()))); }
该函数依赖以下辅助函数(因多处被调用,无法修改):
ImmutableList<TierSummary> helper(ImmutableList<Impact> impacts) {...}
原函数逻辑是对输入Map中每个键对应的ImmutableList<Impact>调用helper,转换为结果列表后重新组装成Map返回。
现在需要将toSummariesByKey的参数和返回值改为ImmutableListMultimap,修改后的函数签名如下:
ImmutableListMultimap<String, ImpactSummary> toSummariesByKey( ImmutableListMultimap<String, Impact> impactsByKey) {...}
直接复用原有代码时出现编译错误:
类型
ImmutableList<Impact>与Impact不兼容
请问这种场景下的最佳实践是什么?
解决方案
核心问题在于ImmutableListMultimap的entrySet()返回的是单个键值对的集合(每个元素对应单个Impact实例),而原代码依赖的是“键对应列表”的entry结构。借助Guava Multimap提供的asMap()方法,可以完美解决这个问题,具体步骤如下:
- 用
asMap()将ImmutableListMultimap转换为ImmutableMap<String, ImmutableList<Impact>>,完全匹配原代码的输入结构; - 复用原有流处理逻辑调用
helper; - 最后将处理后的Map转回
ImmutableListMultimap以符合新的函数签名。
修改后的代码:
ImmutableListMultimap<String, ImpactSummary> toSummariesByKey( ImmutableListMultimap<String, Impact> impactsByKey) { // 转换为兼容原逻辑的Map结构,复用原有处理逻辑 ImmutableMap<String, ImmutableList<ImpactSummary>> tempMap = impactsByKey.asMap().entrySet().stream() .collect( toImmutableMap( entry -> entry.getKey(), entry -> helper(entry.getValue()))); // 将结果转回ImmutableListMultimap return ImmutableListMultimap.copyOf(tempMap); }
补充说明
asMap()是Guava Multimap的标准方法,返回的Map中每个键对应该键在Multimap下的所有值组成的不可变列表,完全满足helper的参数要求;ImmutableListMultimap.copyOf()可以直接将键对应列表的Map转换为目标Multimap类型,保证返回值合规;- 这种方案完全不需要修改
helper函数,同时最大化复用了原有业务逻辑,避免重复开发。
内容的提问来源于stack exchange,提问作者hartmut
相关产品推荐
相关产品推荐

