java - 对流中元素的属性求和
问题描述
我想总结一下我的对象的属性。对象具有如下结构:
class Foo{
String name;
int = price;
int = fees;
//etc
}
我已将它们收集到一个列表中,并希望(通过流)获取所有元素的列表,其中仅包含名称以及价格和费用的总和。例如:
{name=Apple, price=2; fees=1}
{name=Potato, price=7, fees=10}
{name=strawberry, price=5, fees=4}
应该导致这个结果:
{name=Apple, sum=3}
{name=Potato, sum=17}
{name=strawberry, sum=9}
解决方案
Map<String, Integer> result =
foos.stream()
.collect(
Collectors.groupingBy(
Foo::getName,
Collectors.summingInt(x -> x.getPrice() + x.getFees())
)
);
Map
用一个Collectors::groupingBy
和一个下游收集器收集到一个:Collectors::summingInt
。
或者您可以使用toMap
:
foos.stream()
.collect(
Collectors.toMap(
Foo::getName,
x -> x.getPrice() + x.getFees(),
Integer::sum
)
);
如果您稍微阅读一下文档,这很容易实现。