ReactiveX有一个非常简洁的名为Scan的运算符,它类似于reduce,只是它会发出每个中间累加器。
我该如何使用Java Streams来实现这一点呢?Stream#reduce
不是我想要的,因为它返回T
T reduce(T identity, BinaryOperator<T> accumulator)
我想要的是返回Stream<T>
,流的每一项都是每次调用accumulator
时返回的T
Stream.of(1, 2, 3)
.myScan(0, (accumulator, i) -> accumulator + i)
.collect(Collectors.toList()); // [1, 3, 6]
我可以做一些很差劲的事情,比如减少一个List
,然后再转换回一个Stream
,但这很难看。
发布于 2018-06-20 05:11:18
流不支持此操作。您可以将其转换为迭代器,在那里执行,然后再转换回streams,但是streams没有内置的功能来执行此操作。
发布于 2018-06-21 01:49:41
试试StreamEx。我认为它提供了您想要的提取API:
List<Integer> result = StreamEx.of(1, 2, 3).scanLeft((i, j) -> i + j);
System.out.println(result); // [1, 3, 6]
发布于 2018-06-20 05:34:05
java-stream最大的问题是,它被高估了,被理解为一个神奇的解决方案,可以解决任何与集合略有关系的事情。
此API是为支持元素的顺序处理而构建的。没有任何类似Stream的方法来执行下面的代码片段。此外,该API不容易扩展。
以下是您正在谈论的内容:
List<Integer> list = new ArrayList<>();
Stream.of(1, 2, 3).reduce(0, (t, u) -> {
final Integer s = t + u;
list.add(s);
return s;
});
System.out.println(list); // prints [1, 3, 6]
下面是一个使用AtomicInteger
的解决方法,它允许您在执行map(..)
之后继续流式处理
AtomicInteger sum = new AtomicInteger(0);
List<Integer> list = Stream.of(1, 2, 3)
.map(i -> sum.addAndGet(i))
.collect(Collectors.toList());
System.out.println(list); // prints [1, 3, 6]
有时你必须使用不同的方式。
https://stackoverflow.com/questions/50936854
复制相似问题