记一次需要用到复杂的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用法

JDK 8 Stream流的优美用法——groupingBy结合joining用法

记一次返工之后记