相当于ReactiveX可观察扫描的Java流
ReactiveX有一个非常简洁的操作符,叫做reduce,与reduce类似,只是它会发出每个中间累加器 我将如何使用Java流实现这一点相当于ReactiveX可观察扫描的Java流,java,list,rx-java,java-stream,Java,List,Rx Java,Java Stream,ReactiveX有一个非常简洁的操作符,叫做reduce,与reduce类似,只是它会发出每个中间累加器 我将如何使用Java流实现这一点Stream#reduce不是我想要的,因为它返回T: T reduce(T identity, BinaryOperator<T> accumulator) 我可以做一些蹩脚的事情,比如减少一个列表,然后转换回流,但这很难看。流不支持此操作。您可以将其转换为迭代器,在那里执行,然后再转换回streams,但streams没有内置的功能来执行此
Stream#reduce
不是我想要的,因为它返回T
:
T reduce(T identity, BinaryOperator<T> accumulator)
我可以做一些蹩脚的事情,比如减少一个
列表
,然后转换回流
,但这很难看。流不支持此操作。您可以将其转换为迭代器,在那里执行,然后再转换回streams,但streams没有内置的功能来执行此操作。您可以尝试从其他不鼓励的操作中获益。由于您的目标是处理流并继续处理流,因此我们可以使用map
方法来实现这一点。下面的代码利用一个副作用来实现它
public class Scan {
public static void main(String[] args) {
Accumulator accumulator = new Accumulator();
Stream<Integer> originalStream = Stream.of(1, 2, 3);
Stream<Integer> scannedStream = originalStream
.map(i -> accumulator.accumulate(i));
List<Integer> list = scannedStream
.collect(Collectors.toList()); // [1, 3, 6]
for (Integer i : list) {
System.out.println(i);
}
}
private static class Accumulator {
private int value;
public int accumulate(int i) {
return value += i;
}
}
}
公共类扫描{
公共静态void main(字符串[]args){
蓄能器=新蓄能器();
Stream originalStream=第(1,2,3)条流;
Stream scannedStream=原始流
.map(i->累加器.累加(i));
List=scannedStream
.collect(Collectors.toList());//[1,3,6]
for(整数i:列表){
系统输出打印LN(i);
}
}
私有静态类累加器{
私有int值;
公共整数累加(整数i){
返回值+=i;
}
}
}
累加器
可由用于不同扫描操作的功能
替代
但是,您必须了解这些限制和顾虑(例如线程安全)。最大的问题是,它被高估了,被理解为与任何集合稍微相关的一切的魔弹解决方案
此API是为支持元素的顺序处理而构建的。不存在任何类似流的方法来执行下面的代码段。此外,此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]
有时你不得不用不同的方法。试试看。我认为它提供了您想要的提取API:
List<Integer> result = StreamEx.of(1, 2, 3).scanLeft((i, j) -> i + j);
System.out.println(result); // [1, 3, 6]
List result=streamx.of(1,2,3).scanlight((i,j)->i+j);
System.out.println(结果);//[1, 3, 6]
所以在我的示例中,会出现类似这样的东西myScan(Stream.of(1,2,3),0,(a,i)->a+i.collector(Collectors.toList())
?因为我们无法向流接口添加任何东西(比如kotlin)?您可以编写类似的东西,是的。如果您不必坚持流
,IxJava具有以下运算符:
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]
List<Integer> result = StreamEx.of(1, 2, 3).scanLeft((i, j) -> i + j);
System.out.println(result); // [1, 3, 6]