如何在Java Stream中使用switch语句计算交易余额总和
使用Stream API计算TransactionSumView列表的余额总和
你可以通过Stream的reduce方法实现这个计算逻辑,reduce天生适配这种累加/累减的聚合场景,结合Lambda表达式就能替代原来的forEach+switch写法:
内联Lambda实现
List<TransactionSumView> listSum = transactionsRepository.findAllSumByAcc1IdGroupByType(id); BigDecimal sum = listSum.stream() .reduce(BigDecimal.ZERO, (currentTotal, transaction) -> { String type = transaction.getType(); if ("E".equals(type) || "T".equals(type)) { return currentTotal.subtract(transaction.getAmount()); } else if ("I".equals(type)) { return currentTotal.add(transaction.getAmount()); } return currentTotal; // 处理未定义的类型,保持总和不变 }, BigDecimal::add);
抽离逻辑方法实现(可读性更优)
如果想让代码结构更清晰,可以把类型判断的逻辑单独抽成方法,再通过方法引用传入:
// 单独的总和更新方法 private BigDecimal updateTotal(BigDecimal currentTotal, TransactionSumView transaction) { return switch (transaction.getType()) { case "E", "T" -> currentTotal.subtract(transaction.getAmount()); case "I" -> currentTotal.add(transaction.getAmount()); default -> currentTotal; }; } // Stream调用逻辑 List<TransactionSumView> listSum = transactionsRepository.findAllSumByAcc1IdGroupByType(id); BigDecimal sum = listSum.stream() .reduce(BigDecimal.ZERO, this::updateTotal, BigDecimal::add);
代码说明
reduce的第一个参数BigDecimal.ZERO对应原代码中初始的总和值- 第二个参数是累加器:定义单个元素如何更新当前总和
- 第三个参数
BigDecimal::add是组合器,用于并行流场景下合并不同子流的计算结果,串行流中不会生效,但加上能让代码兼容并行流场景
内容的提问来源于stack exchange,提问作者Vladimir
相关产品推荐
相关产品推荐

