gpt4 book ai didi

java - 流状态计算 : cumulative sums

转载 作者:IT老高 更新时间:2023-10-28 20:47:43 27 4
gpt4 key购买 nike

假设我有一个 Java IntStream,是否可以将其转换为具有累积和的 IntStream?例如,以 [4, 2, 6, ...] 开头的流应转换为 [4, 6, 12, ...]。

更一般地说,应该如何实现有状态的流操作?感觉这应该是可能的:

myIntStream.map(new Function<Integer, Integer> {
int sum = 0;
Integer apply(Integer value){
return sum += value;
}
);

有一个明显的限制,即这只适用于顺序流。但是,Stream.map 明确需要无状态映射函数。我是否错过了 Stream.statefulMap 或 Stream.cumulative 操作,还是错过了 Java 流的要点?

以 Haskell 为例,scanl1 函数正好解决了这个例子:

scanl1 (+) [1 2 3 4] = [1 3 6 10]

最佳答案

你可以用原子序数来做到这一点。例如:

import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.IntStream;
import java.util.stream.LongStream;

public class Accumulator {
public static LongStream toCumulativeSumStream(IntStream ints){
AtomicLong sum = new AtomicLong(0);
return ints.sequential().mapToLong(sum::addAndGet);
}

public static void main(String[] args){
LongStream sums = Accumulator.toCumulativeSumStream(IntStream.range(1, 5));
sums.forEachOrdered(System.out::println);
}
}

这个输出:

1
3
6
10

我使用 Long 来存储总和,因为两个 int 加起来完全有可能远远超过 Integer.MAX_VALUE,并且 long 溢出的可能性较小。

关于java - 流状态计算 : cumulative sums,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28355684/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com