如何用Java 8 Stream计算非零相邻元素间的BigDecimal绝对差值
解决方案
要实现这个需求,核心逻辑是遍历列表时跳过零值,仅对连续的非零元素计算相邻的绝对差值。以下是具体实现步骤和代码示例:
关键逻辑说明
- 准确判断零值:BigDecimal的零可能有多种表示形式(如
0、0E-4),必须用compareTo(BigDecimal.ZERO) == 0来判断,不能用equals(会受精度影响)。 - 跟踪连续非零序列:维护一个变量记录上一个非零元素,遇到零值时重置该变量,确保零前后的非零元素不会被错误计算差值。
- 计算绝对差值:对连续的非零相邻元素,用
subtract计算差值后调用abs()取绝对值。
Java 代码实现
import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; public class NonZeroAdjacentDiffCalculator { public static List<BigDecimal> computeNonZeroAdjacentDiffs(List<BigDecimal> input) { List<BigDecimal> result = new ArrayList<>(); BigDecimal lastNonZero = null; for (BigDecimal num : input) { // 判断当前元素是否为零 if (num.compareTo(BigDecimal.ZERO) == 0) { lastNonZero = null; continue; } // 若存在上一个非零元素,计算绝对差值 if (lastNonZero != null) { BigDecimal diff = num.subtract(lastNonZero).abs(); result.add(diff); } // 更新上一个非零元素 lastNonZero = num; } return result; } public static void main(String[] args) { // 构造示例输入 List<BigDecimal> sampleInput = List.of( new BigDecimal("76.2372"), new BigDecimal("0E-4"), new BigDecimal("80.2318"), new BigDecimal("82.1111"), new BigDecimal("88.0937") ); List<BigDecimal> diffs = computeNonZeroAdjacentDiffs(sampleInput); // 输出结果:1.8793、5.9826 diffs.forEach(System.out::println); } }
测试示例验证
对于你提供的示例输入:
- 第一个非零元素
76.2372之后遇到零值,后续的80.2318会重新开始序列。 80.2318与82.1111的绝对差值为1.8793,82.1111与88.0937的绝对差值为5.9826,最终结果列表包含这两个值,符合预期。
内容的提问来源于stack exchange,提问作者OutOfMemoryError
相关产品推荐
相关产品推荐

