Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
相当于ReactiveX可观察扫描的Java流_Java_List_Rx Java_Java Stream - Fatal编程技术网

相当于ReactiveX可观察扫描的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没有内置的功能来执行此

ReactiveX有一个非常简洁的操作符,叫做reduce,与reduce类似,只是它会发出每个中间累加器

我将如何使用Java流实现这一点
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]