gpt4 book ai didi

带有 map 和倍数集的 Java 8 Stream

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:37:40 26 4
gpt4 key购买 nike

我正在尝试使用 java8 流编写这些行:

    for (Town town : getAllTowns(routes)) {

if (originTown.equals(town))
continue;

for (Route route : routes) {
if (route.hasOrigin(originTown) && route.hasDestine(town)) {
distances.put(town, route.getDistance());
break;
}
distances.put(town, maxDistance);
}
}
return distances; //Map<Town,Integer>

目前我得到的结果是:

Map<Town, Integer> distances = getAllTowns(routes).stream()
.filter(town -> !originTown.equals(town))
.forEach(town -> routes.stream()
.filter(route -> route.hasOrigin(originTown) && route.hasDestine(town)
...)
return distances;

如何在内部过滤器之后收集并构建整数为 route.getDistance() 的 Map ?我尝试使用:

.collect(Collectors.toMap(route -> route.getDestineTown(), route -> route.getDistance()))

但是它在 forEach 调用中,然后我不能将它返回给我的变量 distances 因为它只为内部调用生成 map 。我不明白。任何输入都会非常有帮助。谢谢。

最佳答案

您可以使用 findFirst() 构建一个列表,其中包含每个城镇的第一条以该城镇为目的地的路线,然后调用 toMap() 就可以了。缺失城市的默认值可以单独处理。

Collection<Town> towns = getAllTowns(routes);
Map<Town, Integer> distances = towns.stream()
.filter(town -> !originTown.equals(town))
.map(town -> routes.stream()
.filter(route -> route.hasOrigin(originTown) && route.hasDestine(town))
.findFirst())
.filter(Optional::isPresent)
.collect(toMap(route -> route.get().getDestine(), route -> route.get().getDistance()));
towns.stream()
.filter(town -> !distances.containsKey(town))
.forEach(town -> distances.put(town, maxDistance));

(请注意,towncollect() 中不再可用,但您可以利用以下事实:每条路线仅在其目的地城镇为 城镇。)

另请注意,toMap() 不接受重复键。如果可以有多条路线到达任何城镇(我假设可能有),您应该改用 groupingBy()

关于带有 map 和倍数集的 Java 8 Stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39049639/

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