使用Java Stream API按字段分组计算总和

时间:2018-02-13 21:02:13

标签: java stream java-stream

你有两个班级:

Account: number: String, balance: Long
Transaction: uuid: String, sum: Long, account: Account

这两个类都具有相应名称的所有字段的getter(getNumber(),getSum(),getAccount()等等。)

我需要计算每个帐户的交易总额,但不是按帐户计算,而是按帐户编号

我这样做:

Map<Account, Long> totalSumOfTransByEachAccount =
            transactions.stream()
                    .collect(Collectors.groupingBy(Transaction::getAccount, Collectors.reducing(0, Transaction::getSum, Long::sum)));

但我需要使用String键映射 - Account.getNumber()

Map<String, Long> totalSumOfTransByEachAccount =
            transactions.stream()
                    .collect(Collectors.  ??????)

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:4)

另一个变种,我的决定:

 Collectors.groupingBy(t -> t.getAccount().getNumber(),
                    Collectors.reducing(0L, Transaction::getSum, Long::sum))

答案 1 :(得分:2)

你可以这样做:

Map<String, Long> resultSet = transactions.stream()
                .collect(Collectors.groupingBy(t -> t.getAccount().getNumber(),
                               Collectors.summingLong(Transaction::getSum)));