zoukankan      html  css  js  c++  java
  • 记一次需要用到复杂的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类型即可;

    上面的list本身就是先按付款时间降序排序(最近付款的先排前面),然后需要进一步再按付款金额排序,钱多的且最快付钱的排前面;方法目前是将Map转换为List,元素就变成了Entry,然后再通过自定义Comparator来排序;

  • 相关阅读:
    java对redis的基本操作(一)
    Android RelativeLayout 属性
    查看jdk的位数
    Java简单文件传输 socket简单文件传输示例
    Java使用socket实现两人聊天对话
    Java观察者设计模式
    Java装饰设计模式的例子
    php邮件发送 phpmailer
    php smarty 缓存和配置文件的基本使用方法
    php smarty insert用法
  • 原文地址:https://www.cnblogs.com/silentdoer/p/10303078.html
Copyright © 2011-2022 走看看