【发布时间】:2015-06-13 20:24:53
【问题描述】:
我正在尝试使用 Java-8 lambdas 来解决以下问题:
给定一个List<Transaction>,对于每个Category.minorCategory,我需要每个Category.minorCategory 的Transaction.amount 和一个Transaction.accountNumber 的Map 的总和以及每个Transaction.accountNumber 的Transaction.amount 的总和。根据下面的代码,我有这个工作。
我现在需要按Category.majorCategory 分组,基本上返回Map<String, Map<String, MinorCategorySummary>> 键入Category.majorCategory。
在Category.majorCategory 分组阶段之前,我已经完成了所有工作,但很难找到解决方案;使用 lambda 进行编程的范式转变证明了一条陡峭的学习曲线。
TransactionBreakdown 是动作发生的地方,我想返回Map<String, Map<String, MinorCategorySummary>>。
public class Transaction {
private final String accountNumber;
private final BigDecimal amount;
private final Category category;
}
public class Category {
private final String majorCategory;
private final String minorCategory;
}
public class MinorCategorySummary {
private final BigDecimal sumOfAmountPerMinorCategory;
private final Map<String, BigDecimal> accountNumberSumOfAmountMap;
private final Category category;
}
public class TransactionBreakdown {
Function<Entry<String, List<Transaction>>, MinorCategorySummary> transactionSummariser = new TransactionSummariser();
public Map<Object, MinorCategorySummary> getTransactionSummaries(List<Transaction> transactions) {
return transactions
.stream()
.collect(groupingBy(t -> t.getCategory().getMinorCategory()))
.entrySet()
.stream()
.collect(
toMap(Entry::getKey,
transactionSummariser));
}
}
public class TransactionSummariser implements Function<Entry<String, List<Transaction>>, MinorCategorySummary> {
@Override
public MinorCategorySummary apply(
Entry<String, List<Transaction>> entry) {
return new MinorCategorySummary(
entry.getValue()
.stream()
.map(Transaction::getAmount)
.collect(reducing(BigDecimal.ZERO, BigDecimal::add)),
entry.getValue()
.stream()
.collect(
groupingBy(Transaction::getAccountNumber,
mapping(Transaction::getAmount,
reducing(BigDecimal.ZERO, BigDecimal::add)))),
entry.getValue().get(0).getCategory());
}
}
【问题讨论】:
标签: java lambda java-8 java-stream collectors