一:先定義結構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