gpt4 book ai didi

java 8 流 : grouping by and storing sum in new object, 和合并映射

转载 作者:行者123 更新时间:2023-11-30 10:31:51 24 4
gpt4 key购买 nike

我有一个 Row 类,例如:

class Row {
public Long id1;
public String id2;
public Long metric1;
public Long metric2;

public Stats getStats() {
return new Stats(metric1, metric2);
}
}

和一个类统计:

class Stats{
public Long totalMetric1;
public Long totalMetric2;

public void addMetric1(Long metric1) {
this.totalMetric1 = this.totalMetric1 + metric1;
}

public void addMetric2(Long metric2) {
this.totalMetric2 = this.totalMetric2 + metric2;
}
}

我有一个行列表

List<Row> rowList;

我需要将它转换成一个由 id1 和 id2 分组的映射,并且我需要将度量数据以这种形式汇总到 Stats 对象中

Map<Long, Map<String, Stats>>

我正在使用 java 流来生成它,但卡在了这一点上:

Map<Long, Map<String, List<Stats>>> map = stream.collect(
Collectors.groupingBy(r->r.id1(),
Collectors.groupingBy(r->r.id2,
Collectors.mapping(r->r.getStats(), Collectors.toList()))));

我如何将列表转换为另一个具有该列表中所有对象总和的对象?

还有一种方法可以使用 java 流将上述要求形式的两个输出映射合并为第三个输出映射吗?

例子:-

输入:行列表

<1,"ABC", 1, 2>
<1,"ABC", 2, 2>
<1,"XYZ", 1, 2>
<2,"ABC", 1, 2>
<2,"XYZ", 1, 2>
<3,"XYZ", 1, 0>
<3,"XYZ", 2, 1>
<3,"XYZ", 2, 3>

结果: map 按字段 1、字段 2 分组,字段 3 和字段 4 之和

1 - ABC - 3,4
XYZ - 1,2
2 - ABC - 1,2
XYZ - 1,2
3 - XYZ - 5,4

最佳答案

我的建议是以比嵌套集合更简单的方式来实现。在 Row 类中,添加

public Pair<Long,String> getIds() {
return new Pair<>(id1,id2);
}

在统计类中,添加

public Stats merge(Stats other) {
return new Stats(totalMetric1+other.totalMetric1, totalMetric2 + other.totalMetric2);
}

然后写一些类似的东西

      Map<Pair<Long, String>, Stats> stats = rowList.stream().
collect(Collectors.toMap(Row::getIds,Row::getStats, (s1,s2) -> s1.merge(s2)));

如果你对 guava 不过敏(你不应该过敏,这是每个项目中都包含的简单库之一,至少对我而言),你可以用更优雅和可读的方式编写它

      Table<Long, String, Stats> table = rowList.stream().
collect(Tables.toTable(Row::getId1, Row::getId2, Row::getStats,(s1,s2) -> s1.merge(s2),HashBasedTable::create));

无需使用 Pair<> 或嵌套映射。

关于java 8 流 : grouping by and storing sum in new object, 和合并映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42968013/

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