如何使用Java Stream API将累积数组转换为差分数组?
用Java Stream API将累积数组转换为差值数组
给定累积数组:
[0,1,3,6,10,15,21,28,36]
需要将其转换为每个元素为当前值与前一个值差值的数组:
[0,1,2,3,4,5,6,7,8]
转换规则为:
value = [n] - [n-1]
可以通过Java Stream API实现这个转换,先分析你的两次尝试问题,再给出正确实现:
你的代码尝试问题分析
- 尝试1:仅将数组转换为String数组,完全没有处理差值计算逻辑,无法达到转换目的。
- 尝试2:存在多处问题:
skip(1)会跳过第一个输入数组,不符合需求;IntStream.range(0,a.length)从索引0开始遍历,x=0时x-1会导致数组越界;- map中的lambda没有返回值,最终得到的是
List<Void>而非目标类型; - 直接修改原数组属于副作用操作,不符合Stream的设计原则。
正确实现方案
情况1:输入为int数组
如果处理的是int类型数组,直接用IntStream即可完成转换:
int[] cumulative = {0, 1, 3, 6, 10, 15, 21, 28, 36}; int[] result = IntStream.range(0, cumulative.length) .map(i -> i == 0 ? cumulative[i] : cumulative[i] - cumulative[i-1]) .toArray();
情况2:输入为String数组(匹配你的代码场景)
如果你的confirmedReader.readAll()返回的是List<String[]>,可以按以下方式处理:
List<String[]> confirmData = confirmedReader.readAll().stream() .map(arr -> IntStream.range(0, arr.length) .mapToObj(i -> { if (i == 0) { return arr[i]; // 第一个元素直接保留 } int current = Integer.parseInt(arr[i]); int prev = Integer.parseInt(arr[i-1]); return String.valueOf(current - prev); }) .toArray(String[]::new)) .toList();
这个实现的核心逻辑:
- 遍历每个输入的String数组;
- 对数组的每个索引,判断是否为第一个元素:
- 第一个元素直接保留;
- 其余元素解析为整数后计算差值,再转回String;
- 将处理后的元素收集为新的String数组,最终组成List。
内容的提问来源于stack exchange,提问作者Ming Tang
相关产品推荐
相关产品推荐

