ReactiveX 有一个非常简洁的运算符,名为 Scan ,这类似于reduce,只不过它发出每个中间累加器。
我如何使用 Java Streams 来实现这一点? Stream#reduce
不是我想要的,因为它返回 T
:
T reduce(T identity, BinaryOperator<T> accumulator)
我想要的是返回Stream<T>
,流的每一项都是 T
每次调用 accumulator
时都会返回该值:
Stream.of(1, 2, 3)
.myScan(0, (accumulator, i) -> accumulator + i)
.collect(Collectors.toList()); // [1, 3, 6]
我可以做一些蹩脚的事情,比如减少 List
,然后转换回 Stream
,但这很难看。
最佳答案
尝试StreamEx 。我认为它提供了你想要的提取API:
List<Integer> result = StreamEx.of(1, 2, 3).scanLeft((i, j) -> i + j);
System.out.println(result); // [1, 3, 6]
关于Java Stream 相当于 ReactiveX Observable#scan,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50936854/