【发布时间】:2022-02-02 22:19:14
【问题描述】:
我有数据类,它有 4 个字段并有值列表,然后我想使用 java 8 和流替换每一行分组年份和同一年的总和值。请看下面的代码和输出。
class Data {
int id;
int year;
String name;
double value;
}
List<Data> list = new ArrayList<>();
list.add(new Data(101, 2018, "AAA", 20));
list.add(new Data(102, 2019, "BBB", 30));
list.add(new Data(103, 2020, "CCC", 10));
list.add(new Data(104, 2019, "DDD", 50));
list.add(new Data(105, 2020, "EEE", 40));
list.add(new Data(106, 2020, "FFF", 60));
第一个代码尝试:
list.stream().collect(Collectors.groupingBy(Data::getYear, Collectors
.summingDouble(Data::getValue)));
第二次代码尝试:
list.stream().collect(Collectors.toMap(value -> value.getYear(), Function.identity(),
(a, b) -> new Data(a.getId(), a.getYear(), a.getName(), a.getValue() + b.getValue()))).values()
.forEach(value -> System.out.println(value));
输出:
id year name value
101 2018 "AAA" 20
102 2019 "BBB" 80
103 2020 "CCC" 110
预期输出:
id year name value
101 2018 "AAA" 20
102 2019 "BBB" 80
103 2020 "CCC" 110
104 2019 "DDD" 80
105 2020 "EEE" 110
106 2020 "FFF" 110
【问题讨论】:
-
一个流不能既按某个字段分组,又不能同时输出所有未分组的值。因此,这必须是一个两步过程:首先像您一样在地图中按年份聚合(使用第一个代码很好),然后使用该地图将聚合值重新附加到原始列表 - 即处理列表第二次并用地图中的值丰富它。由于这看起来像是一个学校练习,我认为你最好自己尝试一下,然后用你的尝试编辑你的问题。
-
旁注,这看起来与两天前 this question 的练习相同——尽管格式要好得多,老实说——而且至少代码可以编译 :)
-
@DidierL 谢谢你的回复,这听起来像是一个学校练习,但有时即使经过很多努力也没有得到结果,那么最好在这里问。仅供参考,我刚刚开始使用 stacloverflow。
-
@AlexanderIvanchenko 我正在尝试执行此操作,但弹出如下消息:感谢您的反馈!您需要至少 15 声望才能投票,但您的反馈已被记录。
-
@AlexanderIvanchenko this question 如果 ID 结束 Year 是二等舱,并且我希望在两个列表的内部连接后输出相同的输出,那么该怎么做呢?
标签: java java-8 java-stream