【问题标题】:How to turn a Map<List<K>, List<V>> into a Map<K, List<V>>?如何将 Map<List<K>, List<V>> 变成 Map<K, List<V>>?
【发布时间】:2020-03-26 17:55:06
【问题描述】:

在某段代码中我有这种情况,集合的类型是我需要的:

Map<Specialization, List<SpecialistInfo>> specialistsMap = specialistsResponse
    .getSpecialists()
    .stream()
    .collect(groupingBy(SpecialistInfo::getSpecializations));

但实际上,该流返回一个Map&lt;List&lt;Specialization&gt;, List&lt;SpecialistInfo&gt;&gt;.

getSpecialists() 方法返回List&lt;SpecialistInfo&gt; specialists; 并且SpecialistInfo 的每个实例也包含一个列表。所以,getSpecializations 方法返回List&lt;Specialization&gt; specializations

我需要将我的地图分组为Map&lt;Specialization, List&lt;SpecialistInfo&gt;&gt;

如何通过 Stream API 实现?

【问题讨论】:

  • 您想复制数据?像同一个列表中的专业化一样,关联相同的值列表?
  • 我没有对此进行测试,但我很好奇 .collect(Collectors.flatMapping(specialistInfo -&gt; specialistInfo.getSpecializations().stream(), Collectors.groupingBy(Function.identity()))); 是否有可能
  • 输入数据结构包含什么并不完全清楚。 Specialization 在地图中用作键的所有列表中是否唯一? `List 的值是否属于键列表的所有 Spezialization?

标签: java collections java-stream


【解决方案1】:

所以你有一个List&lt;SpecialistInfo&gt;,每个SpecialistInfo 都有一个List&lt;Specialization&gt;。你需要反向映射这些。那么,SpecializationSpecialistInfo 是唯一的,SpecializationsSpecialistInfo 之间存在多对多关系。

如果您正在寻找不使用线程安全的流 API 的解决方案(与 YCF_L 的解决方案相比)

List<SpecialistInfo> specialists = getSpecialists();
Map<Specialization, List<SpecialistInfo>> specMap = new HashMap<>();
for (SpecialistInfo specInfo : specialists) { 
    for (Specialization spec : specInfo.getSpecializations()) {
        specMap.computeIfAbsent(spec, k -> new ArrayList<>()).add(specInfo);
    }
}

【讨论】:

  • 它不起作用。我有一个例外“不能内部功能接口类型”
  • @MaksimRybalkin 我的错,我没有先编译就写了。为我服务...我已经修改了答案,希望对您有所帮助!
猜你喜欢
  • 2019-01-23
  • 2018-11-23
  • 1970-01-01
  • 2013-12-20
  • 2019-10-10
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 2018-10-16
相关资源
最近更新 更多