【问题标题】:Calculate sum using Java Stream API grouping by field使用 Java Stream API 按字段分组计算总和
【发布时间】:2018-07-24 08:10:56
【问题描述】:

你有两个类:

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

两个类都有对应名称的所有字段的 getter(getNumber()、getSum()、getAccount() 等)。

我需要计算每个帐户的交易总和,但不是按帐户,而是按 Account.number 分组

我是这样设计的:

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

但我需要带有字符串键的映射 - Account.getNumber()

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

谁能帮帮我?

【问题讨论】:

    标签: java stream java-stream


    【解决方案1】:

    您可以这样做:

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

    【讨论】:

    • 非常感谢)也许可以用reduce做到这一点?
    • @IvanSPb 如果解决方案解决了您的问题,请随时接受答案。
    【解决方案2】:

    还有一个变种,我的决定:

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

    【讨论】:

    • Collectors.reducing 工厂方法是几乎大多数收集器的概括,但是,我会按照我的答案中的建议使用 Collectors.summingLong(Transaction::getSum) 而不是 Collectors.reducing(0L, Transaction::getSum, Long::sum) 以提高可读性,并且可能有与冗长的减少相比,性能更好。无论如何 +1 提出你自己的答案;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多