给定以下List类的Transaction,并使用Java 8 lambda,我希望获得ListResultantDTO,每种帐户类型一个。

public class Transaction {

    private final BigDecimal amount;
    private final String accountType;
    private final String accountNumber;

}

public class ResultantDTO {

    private final List<Transaction> transactionsForAccount;

    public ResultantDTO(List<Transaction> transactionsForAccount){
        this.transactionsForAccount = transactionsForAccount;
    }

}


到目前为止,我使用以下代码将List<Transaction>accountType分组。

Map<String, List<Transaction>> transactionsGroupedByAccountType = transactions
    .stream()
    .collect(groupingBy(Transaction::getAccountType));


如何返回List<ResultantDTO>,将列表从每个映射键传递到构造函数,每个ResultantDTO包含一个accountType

最佳答案

您可以在单流操作中执行此操作:

public List<ResultantDTO> convert(List<Transaction> transactions) {
    return transactions.stream().collect(
            collectingAndThen(
                groupingBy(
                        Transaction::getAccountType,
                        collectingAndThen(toList(), ResultantDTO::new)),
                map -> new ArrayList<>(map.values())));
}


在这里collectingAndThen使用了两次:一次用于下游Collector将列表转换为ResultantDTO对象,一次用于将结果映射转换为其值列表。

09-27 14:29