gpt4 book ai didi

Java 8 Lambdas flatmapping、groupingBy 和 mapping 以获取 T 和 List 的 Map

转载 作者:行者123 更新时间:2023-12-03 23:03:07 26 4
gpt4 key购买 nike

这是我到目前为止所拥有的:

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 的 List 转换为 <Care, List<Correlative>> 的 Map。
在上面的示例中, mapping() 函数中的代码是伪造的。 FacilityCare 只有设施 ID 而没有设施实体。我希望在 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;
});
});
});

最佳答案

有时,流并不是最好的解决方案。情况似乎是这样,因为在沿着管道运行时您正在丢失每个 facility 实例。
相反,您可以按如下方式进行:

Map<Care, List<Correlative>> mapToHydrate = new LinkedHashMap<>();
quickSearchList.forEach(q -> {
Facility facility = q.getFacility();
facility.getFacilityCares().forEach(fCare ->
mapToHydrate.computeIfAbsent(fCare.getCare(), k -> new ArrayList<>())
.add(Correlative.createFromFacility(facility)));
});
这使用 Map.computeIfAbsent 的返回值(它是新创建的相关列表或已经存在的列表)。
从您的问题中不清楚为什么在将它们添加到 map 之前需要特别注意。

编辑: 从 Java 16 开始,您可能想要使用 Stream.mapMulti :
Map<Care, List<Correlative>> mapToHydrate = quickSearchList.stream()
.map(QuickSearch::getFacility)
.mapMulti((facility, consumer) -> facility.getFacilityCares()
.forEach(fCare -> consumer.accept(Map.entry(fCare.getCare(), facility))))
.collect(Collectors.groupingBy(
e -> e.getKey(),
Collectors.mapping(
e -> Correlative.createFromFacility(e.getValue()),
Collectors.toList())));

关于Java 8 Lambdas flatmapping、groupingBy 和 mapping 以获取 T 和 List<K> 的 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64326329/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com