给定以下List
类的Transaction
,并使用Java 8 lambda,我希望获得List
的ResultantDTO
,每种帐户类型一个。
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
对象,一次用于将结果映射转换为其值列表。