Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java流API按字段分组计算总和_Java_Stream_Java Stream - Fatal编程技术网

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

使用Java流API按字段分组计算总和,java,stream,java-stream,Java,Stream,Java Stream,你有两个班: Account: number: String, balance: Long Transaction: uuid: String, sum: Long, account: Account 这两个类都有对应名称(getNumber()、getSum()和getAccount()等)的所有字段的getter 我需要计算每个帐户的交易总额,但不是按帐户,而是按帐户分组。编号 我是这样做的: Map<Account, Long> totalSumOfTransByEachAc

你有两个班:

Account: number: String, balance: Long
Transaction: uuid: String, sum: Long, account: Account
这两个类都有对应名称(getNumber()、getSum()和getAccount()等)的所有字段的getter

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

我是这样做的:

Map<Account, Long> totalSumOfTransByEachAccount =
            transactions.stream()
                    .collect(Collectors.groupingBy(Transaction::getAccount, Collectors.reducing(0, Transaction::getSum, Long::sum)));
映射每个交易账户的交易总额=
transactions.stream()
.collect(Collectors.groupingBy(Transaction::getAccount,Collectors.reduction(0,Transaction::getSum,Long::sum));
但是我需要带字符串key-Account.getNumber()的映射

映射每个交易账户的交易总额=
transactions.stream()
.收集(收集器)
有人能帮我吗?

您可以通过以下方式来帮助我:

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

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

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

非常感谢)也许可以使用reduce?@IvanSPb来完成,如果解决方案解决了您的问题,那么请随意接受答案。
收集器。reduce
工厂方法是对大多数收集器的概括,但是,我会选择
收集器。summingLong(Transaction::getSum)
如我在回答中所建议的,而不是
收集器。减少(0L,Transaction::getSum,Long::sum)
以提高可读性,与冗长的减少相比,可能具有更好的性能。无论如何+1,因为你自己给出了答案;-)
 Collectors.groupingBy(t -> t.getAccount().getNumber(),
                    Collectors.reducing(0L, Transaction::getSum, Long::sum))