記一次須要用到複雜的groupingBy的需求

一:先定義結構java

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共投資多少【不從數據庫裏作統計減輕數據庫壓力】,所以這裏就用到了以下代碼:ide

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類型便可;this

上面的list自己就是先按付款時間降序排序(最近付款的先排前面),而後須要進一步再按付款金額排序,錢多的且最快付錢的排前面;方法目前是將Map轉換爲List,元素就變成了Entry,而後再經過自定義Comparator來排序;idea

相關文章
相關標籤/搜索