记一次需要用到复杂的groupingBy的需求
Posted silentdoer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次需要用到复杂的groupingBy的需求相关的知识,希望对你有一定的参考价值。
一:先定义结构
public class Foo { private Integer id; private String name; private BigDecimal amount; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public BigDecimal getAmount() { return amount; } public void setAmount(BigDecimal amount) { this.amount = amount; } }
然后在数据库里有N条上面结构的数据,其中id表示是某个人,amount表示是该用户投资了多少钱,因为存在多次投资,所以一个id可能有多条记录;
现在的需求是要统计每个id共投资多少【不从数据库里做统计减轻数据库压力】,因此这里就用到了如下代码:
LinkedHashMap<Integer, BigDecimal> result = list.stream().collect(Collectors.groupingBy(Foo::getId, LinkedHashMap::new, Collectors.reducing(new BigDecimal(0), Foo::getAmount, BigDecimal::add)));
不过要注意 Collectors.reducing(new BigDecimal(0), Foo::getAmount, BigDecimal::add)的idea类型判断有一些问题,Foo::getAmount它可能会判断不出来是Foo类型而是Object类型,这个自己强制写Foo类型即可;
以上是关于记一次需要用到复杂的groupingBy的需求的主要内容,如果未能解决你的问题,请参考以下文章
JDK 8 Stream流的优美用法——groupingBy结合joining用法
JDK 8 Stream流的优美用法——groupingBy结合joining用法