一:先定义结构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