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

如何优化重复的Map/Reduce Lambda表达式,复用BigDecimal属性计算逻辑

Java 代码复用优化:BigDecimal 批量求和逻辑封装

核心思路

把重复的流遍历、属性提取、BigDecimal求和、精度处理逻辑封装成通用方法,通过函数式接口传递不同的属性提取规则,实现代码复用。

实现方案

1. 封装通用求和工具方法

创建工具类(比如InvoiceUtils),编写静态方法统一处理求和逻辑:

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
import java.util.function.Function;

public class InvoiceUtils {
    // 基础版本:直接从InvoiceLine提取BigDecimal属性
    public static BigDecimal sumInvoiceLines(List<InvoiceLine> invoiceLines, Function<InvoiceLine, BigDecimal> valueExtractor) {
        return invoiceLines.stream()
                .map(valueExtractor)
                .reduce(BigDecimal.ZERO, BigDecimal::add)
                .setScale(2, RoundingMode.HALF_UP);
    }

    // 优化版本:针对重复的line.getAmount()提取,进一步简化调用
    public static BigDecimal sumAmountProperties(List<InvoiceLine> invoiceLines, Function<Amount, BigDecimal> amountPropertyExtractor) {
        return sumInvoiceLines(invoiceLines, line -> amountPropertyExtractor.apply(line.getAmount()));
    }
}

2. 简洁调用

使用优化后的方法,代码会非常简洁且易维护:

new Amount()
    .withAmountIncVat(InvoiceUtils.sumAmountProperties(invoiceLines, Amount::getAmountIncVat))
    .withAmount(InvoiceUtils.sumAmountProperties(invoiceLines, Amount::getAmount))
    .withVatAmount(InvoiceUtils.sumAmountProperties(invoiceLines, Amount::getVatAmount));

优势说明

  • 完全消除重复代码,统一求和与精度处理逻辑
  • 后续如果需要修改精度(比如从2位改3位)或求和规则(比如改用reduce的重载处理null值),只需修改工具类中的方法,无需逐个修改调用处
  • 方法命名清晰,代码可读性更强

内容的提问来源于stack exchange,提问作者Joselo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:46:58