gpt4 book ai didi

Java 8 lambda 嵌套映射

转载 作者:行者123 更新时间:2023-11-30 06:14:08 25 4
gpt4 key购买 nike

我正在尝试使用 Java-8 lambda 来解决以下问题:

给定一个 List<Transaction> , 对于每个 Category.minorCategory我需要 Transaction.amount 的总和每Category.minorCategory和一个 MapTransaction.accountNumber总和为 Transaction.amountTransaction.accountNumber .根据下面的代码,我有这个工作。我现在需要按 Category.majorCategory 分组,本质上返回一个 Map<String, Map<String, MinorCategorySummary>>键入 Category.majorCategory .

在按 Category.majorCategory 分组之前,我已经完成了所有工作但很难看到解决方案;事实证明,使用 lambda 进行编程的范式转变是一条陡峭的学习曲线。

TransactionBreakdown是 Action 发生的地方,也是我想返回 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());
}

}

最佳答案

我觉得你的类(class)设计很奇怪。为什么只将类别放入摘要类中,然后将类别作为映射键?有一个没有类别的摘要类会更有意义:

public class TransactionSummary {

private final BigDecimal amount;
private final Map<String, BigDecimal> acctToTotal;

TransactionSummary(Map<String, BigDecimal> acctToTotal) {
this.acctToTotal = Collections.unmodifiableMap(acctToTotal);
this.amount = acctToTotal.values().stream()
.reduce(BigDecimal.ZERO, BigDecimal::add);
}

public static Collector<Transaction, ?, TransactionSummary> collector() {
// this can be a static constant
return collectingAndThen(
toMap(Transaction::getAccountNumber,Transaction::getAmount,BigDecimal::add),
TransactionSummary::new
);
}

// getters
}

现在你的两个问题已经清楚且没有冗余地解决了:

Map<String, TransactionSummary> minorSummary = transactions.stream()
.collect(groupingBy(
t -> t.getCategory().getMinorCategory(),
TransactionSummary.collector()
));

Map<String, Map<String, TransactionSummary>> majorMinorSummary = transactions.stream()
.collect(groupingBy(
t -> t.getCategory().getMajorCategory(),
groupingBy(
t -> t.getCategory().getMinorCategory(),
TransactionSummary.collector()
)
));

关于Java 8 lambda 嵌套映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30823211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com