首页 > 解决方案 > 对流中元素的属性求和

问题描述

我想总结一下我的对象的属性。对象具有如下结构:

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}

标签: javasumjava-stream

解决方案


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
        )
    );

如果您稍微阅读一下文档,这很容易实现。


推荐阅读