如何优化重复的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
相关产品推荐
相关产品推荐

