这是我到目前为止所拥有的:
Map<Care, List<Correlative>> mapOf = quickSearchList
.stream()
.map(QuickSearch::getFacility)
.collect(Collectors.flatMapping(facility -> facility.getFacilityCares().stream(),
Collectors.groupingBy(FacilityCare::getCare,
Collectors.mapping(c -> {
final Facility facility = new Facility();
facility.setId(c.getFacilityId());
return Correlative.createFromFacility(facility);
}, Collectors.toList()))));
我有一个快速搜索列表。快速搜索中的每个项目都有一个设施,如下所示:
public class QuickSearch {
Facility facility;
}
在每个设施中,都有一个 FacilityCare 列表,如下所示:
public class Facility {
List<FacilityCare> facilityCares;
}
最后,FacilityCare 具有 Care 属性,如下所示:
public class FacilityCare {
Care care;
}
现在,想法是将 QuickSearch 列表转换为<Care, List<Correlative>>
. 在上面的示例中,mapping() 函数中的代码是伪造的。FacilityCare 只有facilityID 而没有Facility 实体。我希望在 flatMapping 中作为参数的设施对象在 mapping() 函数中再次成为我的参数,如下所示:
Collectors.mapping(c -> Correlative.createFromFacility(facility))
其中“facility”与 flatMapping 中的对象相同。
有什么办法可以做到这一点?请让我知道是否需要进一步解释。
编辑: 这是一个没有充分利用收集器的解决方案。
final Map<Care, List<Correlative>> mapToHydrate = new HashMap<>();
quickSearchList
.stream()
.map(QuickSearch::getFacility)
.forEach(facility -> {
facility.getFacilityCares()
.stream()
.map(FacilityCare::getCare)
.distinct()
.forEach(care -> {
mapToHydrate.computeIfAbsent(care, care -> new ArrayList<>());
mapToHydrate.computeIfPresent(care, (c, list) -> {
list.add(Correlative.createFromFacility(facility));
return list;
});
});
});