在部分代码中,我遇到的情况是我需要的集合类型:
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完成?
List<SpecialistInfo>
,每个SpecialistInfo
都有一个List<Specialization>
。您需要反向映射这些。假定Specialization
和SpecialistInfo
是唯一的,并且Specializations
和SpecialistInfo
之间存在多对多关系。如果您正在寻找不使用线程安全的流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);
}
}
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; }