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

如何正确使用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]

错误原因

  1. AtomicInteger用途错误:你把diff用来存储差值,但它应该用来保存前一个元素的值,作为计算当前差值的基准。
  2. getAndSet逻辑错误:getAndSet(newValue)会先返回AtomicInteger的旧值,再更新为newValue。你传入的i - diff.get()是当前元素与旧值的差值,导致diff最终被设置为差值而非前一个元素,后续计算全部基于错误基准。
  3. 初始值不严谨:虽然初始值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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:55:23