对list的数据按某些属性进行分组,然后对组内某些属性求和,类似sql的group by功能。

例如以下以机构和客户号组合分组,对debt求和,最后形成一个新的list 

 public static void main(String[] args) {
        DebtCust d1 = new DebtCust().setDeptId(1L).setCustCode("1").setDebt(new BigDecimal("5.1"));
        DebtCust d2 = new DebtCust().setDeptId(2L).setCustCode("2").setDebt(new BigDecimal("5.1"));
        DebtCust d3 = new DebtCust().setDeptId(1L).setCustCode("1").setDebt(new BigDecimal("5.0"));
        DebtCust d4 = new DebtCust().setDeptId(3L).setCustCode("1").setDebt(new BigDecimal("5.0"));
        DebtCust d5 = new DebtCust().setDeptId(2L).setCustCode("2").setDebt(new BigDecimal("5.1"));
        List<DebtCust> debtCustList = Arrays.asList(new DebtCust[]{d1, d2, d3, d4, d5});
        List<DebtCust> newList = new ArrayList<>();
        debtCustList.parallelStream().collect(Collectors.groupingBy(d -> d.getDeptId() + d.getCustCode(), Collectors.toList()))
                .forEach((id, groupList) -> {
                    groupList.stream().reduce(
                            (a, b) -> new DebtCust()
                                            .setDeptId(a.getDeptId())
                                            .setCustCode(a.getCustCode())
                                            .setDebt(a.getDebt().add(b.getDebt()))
                    ).ifPresent(newList::add);
                });
        System.out.println(newList);
    }

tips:本方法仅适用大数据量统计(不适用于超大对象,例如list长度100w)

记录下看到的金句:买好的,不如买得好,买得好不如卖得巧。

所谓的价值投资,依然离不开择时,不得不承认择时是困难的,专业的芒格巴菲等智者也有失误的时候,所以,不轻易择时。

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐