You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:50:25