0

我不能编写一个收集器来计算每个帐户(即按帐号)的交易总额(长类型,而不是整数)。收集器将应用于事务流。如何使用 groupingBy 这个链 Transaction -> Account -> Number ?

class TransactionCollector {

public static Map<String, Long> getAccount2TransSum(List<Transaction> trans) {
    return trans.stream().collect(  // place code here 
            }

static class Transaction {

    private final String uuid;
    private final Long sum;
    private final Account account;

    public Transaction(String uuid, Long sum, Account account) {
        this.uuid = uuid;
        this.sum = sum;
        this.account = account;
    }

    public String getUuid() {
        return uuid;
    }

    public Long getSum() {
        return sum;
    }

    public Account getAccount() {
        return account;
    }

    @Override
    public String toString() {
        return "Transaction{" +
                "uuid='" + uuid + '\'' +
                ", sum=" + sum +
                '}';
    }
}

static class Account {
    private final String number;
    private final Long balance;

    public Account(String number, Long balance) {
        this.number = number;
        this.balance = balance;
    }

    public String getNumber() {
        return number;
    }

    public Long getBalance() {
        return balance;
    }

    @Override
    public String toString() {
        return "Account{" +
                "number='" + number + '\'' +
                ", balance=" + balance +
                '}';
    }
}

}

4

2 回答 2

2

您可以使用下游收集器

trans.stream().collect(
  groupingBy(
    Transaction::getAccount,
    groupingBy(Account::getNumber)
  )
)

这将首先按他们的帐户对交易进行分组,然后按他们的号码进行分组

编辑:看起来你真的想要toMap收藏家

trans.stream().collect(
    toMap(
      t -> t.getAccount().getNumber(),
      t -> t.getSum()
    )
)
于 2020-06-01T19:27:23.650 回答
0

您可以groupingBysummingLong收集器一起使用来对交易进行分组并计算它们的总和。

trans.stream()
    .collect(Collectors.groupingBy(
        transaction -> transaction.getAccount().getNumber(),
        Collectors.summingLong(Transaction::getSum)))

结果,您将有一个Map<String, Long>,其中键是帐号,值是具有该号码的所有帐户交易的总和。

于 2020-06-01T19:34:43.093 回答