如何正确使用AtomicInteger getAndSet?Java Stream计算连续元素差值问题
问题:Java Stream结合AtomicInteger计算连续元素差值结果不符合预期
你尝试用Java Stream和AtomicInteger计算列表中每个元素与前一个元素的差值,但代码输出结果和预期不符。
原代码
List<Integer> list = List.of(1,2,3,5,6,8,9,10,22,23,27); AtomicInteger diff = new AtomicInteger(1); List<Integer> result = list.stream() .skip(1) .map(i -> diff.getAndSet(i - diff.get())) .toList(); System.out.println(result);
实际输出
[1, 1, 2, 3, 3, 5, 4, 6, 16, 7]
预期输出
[1, 1, 2, 1, 2, 1, 1, 12, 1, 4]
错误原因
- AtomicInteger用途错误:你把
diff用来存储差值,但它应该用来保存前一个元素的值,作为计算当前差值的基准。 getAndSet逻辑错误:getAndSet(newValue)会先返回AtomicInteger的旧值,再更新为newValue。你传入的i - diff.get()是当前元素与旧值的差值,导致diff最终被设置为差值而非前一个元素,后续计算全部基于错误基准。- 初始值不严谨:虽然初始值1刚好是列表第一个元素,但硬编码而非动态获取
list.get(0),容易在列表变更时出错。
修正方案
调整AtomicInteger的用途,让它始终保存前一个元素的值,计算完差值后更新为当前元素:
List<Integer> list = List.of(1,2,3,5,6,8,9,10,22,23,27); // 初始化为列表第一个元素,作为差值计算的初始基准 AtomicInteger prevElement = new AtomicInteger(list.get(0)); List<Integer> result = list.stream() .skip(1) .map(i -> { int prev = prevElement.get(); // 计算当前元素与前一个元素的差值 int currentDiff = i - prev; // 更新基准为当前元素,供下一次计算使用 prevElement.set(i); return currentDiff; }) .toList(); System.out.println(result);
输出结果
[1, 1, 2, 1, 2, 1, 1, 12, 1, 4]
内容的提问来源于stack exchange,提问作者wannaBeDev
相关产品推荐
相关产品推荐

