Java。 groupingBy 扔到 类

Java. groupingBy throw to classes

我无法编写一个收集器来计算每个帐户(即按帐号)的交易总额(长型,而不是整数)。收集器将应用于交易流。 如何为这个链交易使用groupingBy -> 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 +
                '}';
    }
}

}

您可以使用下游收集器

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

这将首先按帐户对交易进行分组,然后按编号分组

编辑: 看起来你真的想要 toMap 收集器

trans.stream().collect(
    toMap(
      t -> t.getAccount().getNumber(),
      t -> t.getSum()
    )
)

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

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

因此,您将得到一个 Map<String, Long>,其中键是帐号,值是该帐号所有交易的总和。