Java8Lambdas嵌套映射

Java8Lambdas嵌套映射,java,lambda,java-8,java-stream,collectors,Java,Lambda,Java 8,Java Stream,Collectors,我正在尝试使用Java-8 lambdas解决以下问题: 给定一个列表,对于每个类别。minorCategory我需要每个类别的交易金额。minorCategory和一个交易的映射交易账号交易金额每个交易账号。我有这个工作,按照下面的代码。 我现在需要按Category.majorCategory进行分组,基本上返回键入Category.majorCategory的Map 我一直在努力,直到按照类别进行分组。majorCategory但很难找到解决方案;使用lambdas编程的范式转变证明是一条

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

给定一个
列表
,对于每个
类别。minorCategory
我需要每个
类别的
交易金额
。minorCategory
和一个
交易的
映射
交易账号
交易金额每个
交易账号
。我有这个工作,按照下面的代码。 我现在需要按
Category.majorCategory
进行分组,基本上返回键入
Category.majorCategory
Map

我一直在努力,直到按照
类别进行分组。majorCategory
但很难找到解决方案;使用lambdas编程的范式转变证明是一条陡峭的学习曲线

TransactionBreakdown
是操作发生的地方,我想在这里返回
Map

公共类事务{
私有最终字符串accountNumber;
私人最终金额;
私人最终类别;
}
公共类类别{
私人最终弦主分类;
私有最终字符串小类别;
}
公共类小类别摘要{
私有最终大十进制sumOfAmountPerMinorCategory;
私人最终地图帐号SumofAmountMap;
私人最终类别;
}
公共类事务分解{
函数TransactionSummarier=新TransactionSummarier();
公共映射getTransactionSummaries(列出事务){
退货交易记录
.stream()
.collect(分组依据(t->t.getCategory().getMinorCategory())
.entrySet()
.stream()
.收集(
toMap(条目::getKey,
交易摘要);
}
}
公共类TransactionSummarier实现函数{
@凌驾
公共小类别摘要适用(
条目(条目){
返回新的minorCategory摘要(
entry.getValue()
.stream()
.map(事务::getAmount)
.collect(减少(BigDecimal.ZERO,BigDecimal::add)),
entry.getValue()
.stream()
.收集(
分组依据(事务::getAccountNumber,
映射(事务::getAmount,
减少(BigDecimal.ZERO,BigDecimal::add)),
entry.getValue().get(0.getCategory());
}
}

我觉得你的课堂设计很奇怪。为什么将category放入summary类中只是为了将category作为映射键?如果在摘要类中没有类别,则更有意义:

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 AcctTotal){
this.acctToTotal=集合.unmodifiableMap(acctToTotal);
this.amount=accttotal.values().stream()
.reduce(BigDecimal.ZERO,BigDecimal::add);
}
公共静态收集器(){
//这可以是一个静态常数
返回收集,然后(
toMap(事务::getAccountNumber,事务::getAmount,BigDecimal::add),
TransactionSummary::新建
);
}
//吸气剂
}
现在,您的两个问题得到了明确解决,没有冗余:

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()
                )
        ));
Map minorSummary=transactions.stream()
.收集(分组)(
t->t.getCategory().getMinorCategory(),
TransactionSummary.collector()
));
Map majorMinorSummary=transactions.stream()
.收集(分组)(
t->t.getCategory().getMajorCategory(),
分组依据(
t->t.getCategory().getMinorCategory(),
TransactionSummary.collector()
)
));

感谢您的解决方案,当您看到它时,它看起来非常简单,但我一直在努力实现。关于这个类别,你是对的,它不应该出现在摘要中——它是在几个小时试图让我的头靠近兰博达斯之后出现的——我感到绝望:)
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()
                )
        ));