【发布时间】:2021-02-26 05:17:24
【问题描述】:
我有一个DijkstraWays 对象列表:
List<DijkstraWays> dijkstraWaysList= ...
DijkstraWays 具有以下属性和 getter:
class DijkstraWays {
String name;
Double cost;
public String getName() {
return name;
}
public Double getCost() {
return cost;
}
}
我需要按name 对这个列表进行分组,并得出cost 的总和。为此,我使用了以下代码:
Map<String, Double> result = dijkstraWaysList.stream()
.collect(Collectors.groupingBy(DijkstraWays::getName,
Collectors.summingDouble(DijkstraWays::getCost)));
此代码有效,但它不保留djkstraWaysList 列表中元素的插入顺序。这是因为Collectors.groupingBy返回的是一个Map/HashMap,而这种类型不保留插入顺序。
如何使用Collectors.groupingBy 和Collectors.summingDouble 保留djkstraWaysList 列表的插入顺序?我在互联网上找到了几个示例,其中结果被转换为LinkedHashMap,它保留了这一点,但没有一个可以插入Collectors.summingDouble。示例:
dijkstraWays.stream()
.collect(Collectors.groupingBy(DijkstraWays::getName,
LinkedHashMap::new,
Collectors.toList()));
我还需要 cost 的总和,但在这些带有 LinkedHashMap 的示例中,我不能将它与 groupby 一起使用。
谢谢。
【问题讨论】:
-
你的意思是
Collectors.groupingBy(DijkstraWays::getName, LinkedHashMap::new, Collectors.summingDouble(DijkstraWays::getCost))? -
谢谢@ernest_k。这非常有效。代码:LinkedHashMap
collect = dijkstraWays.stream() .collect(Collectors.groupingBy(DijkstraWays::getName, LinkedHashMap::new, Collectors.summingDouble(DijkstraWays::getCost)));
标签: java collections java-stream