【发布时间】:2016-07-08 13:22:12
【问题描述】:
我有一个如下所示的对象列表:
{
value=500
category="GROCERY"
},
{
value=300
category="GROCERY"
},
{
value=100
category="FUEL"
},
{
value=300
category="SMALL APPLIANCE REPAIR"
},
{
value=200
category="FUEL"
}
我想将其转换为如下所示的对象列表:
{
value=800
category="GROCERY"
},
{
value=300
category="FUEL"
},
{
value=300
category="SMALL APPLIANCE REPAIR"
}
基本上把所有同类别的值加起来。
我应该使用 flatMap 吗?减少?我不明白这些的细微差别要弄清楚。
帮助?
编辑:
这个问题有很多重复: Is there an aggregateBy method in the stream Java 8 api? 和 Sum attribute of object with Stream API
但在这两种情况下,最终结果都是地图,而不是列表
根据@AndrewTobilko 和@JBNizet 的回答,我使用的最终解决方案是:
List<MyClass> myClassList = list.stream()
.collect(Collectors.groupingBy(YourClass::getCategory,
Collectors.summingInt(YourClass::getValue)))
.entrySet().stream().map(e -> new MyClass(e.getKey(), e.getValue()).collect(toList());
【问题讨论】:
-
@AndrewTobilko 你的回答对我来说是正确的。你为什么删除它?
-
是的,我抓住了它,它工作正常!你为什么删除它?唯一的问题(我可以忍受)是我得到一个 Map
返回。 -
只需附加
.entrySet().stream().map(e -> new YourClass(e.getKey(), e.getValue()).collect(toList());
标签: java stream java-8 grouping