如何将地图 ,列表 >转换为地图 >?

问题描述 投票:-1回答:1

在部分代码中,我遇到的情况是我需要的集合类型:

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

但是实际上,该流返回了Map<List<Specialization>, List<SpecialistInfo>>.

getSpecialists()方法返回List<SpecialistInfo> specialists;,并且SpecialistInfo的每个实例也包含一个列表。因此,方法getSpecializations返回List<Specialization> specializations

我需要将地图分为Map<Specialization, List<SpecialistInfo>>

如何通过Stream API完成?

java collections stream java-stream
1个回答
1
投票
因此您有一个List<SpecialistInfo>,每个SpecialistInfo都有一个List<Specialization>。您需要反向映射这些。假定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); } }


0
投票
通用解决方案:

public <K, V> Map<K, List<V>> convert(Map<List<K>, List<V>> specialistsResponse) { Map<K, List<V>> result = new HashMap<>(); specialistsResponse.keySet().stream() .forEach(e -> e.forEach(e2 -> result.put(e2, specialistsResponse.get(e)))); return result; }

或通过使用对象:

public Map<Specialization, List<SpecialistInfo>> convert(Map<List<Specialization>, List<SpecialistInfo>> specialistsResponse) { Map<Specialization, List<SpecialistInfo>> result = new HashMap<>(); specialistsResponse.keySet().stream() .forEach(e -> e.forEach(e2 -> result.put(e2, specialistsResponse.get(e)))); return result; }

© www.soinside.com 2019 - 2024. All rights reserved.