代码之家  ›  专栏  ›  技术社区  ›  wannaBeDev

如何正确使用AtomicInteger getAndSet?

  •  0
  • wannaBeDev  · 技术社区  · 3 年前

    我想获得使用Java流和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 回复  |  直到 3 年前
        1
  •  4
  •   Basil Bourque    3 年前

    我不会使用原子类型。相反,我将从列表索引流开始:

    List<Integer> result = IntStream.range(0, list.size() - 1)
                           .map(i -> list.get(i + 1) - list.get(i))
                           .boxed()
                           .toList();
    

    请注意,传递给的结束编号 IntStream#range 是 独家 而起点是包容性的。靶场有一半开放。

    这(IMO)比依赖副作用更简单、更清洁(更实用)。