RxJava 2以相反的顺序处理资源

时间:2017-09-19 14:46:30

标签: rx-java rx-java2

基本上,我所追求的是如何创建资源1,2,3,4,处理结果,然后处理4,3,2,1,要求如果有的话创建资源3时出错,我们只需要处理2,1。

作为一个例子,让我们说我们有:

Observable1从文件中读取行并每行进行一次发射。 为了正确处理文件资源,文件应该在开头打开,最后关闭。

Observable2应该接受来自Observable1的发射,并将它们写入另一个文件。为了简单起见,我们只需要在每行的末尾添加一个逗号。 为了正确处理另一个文件资源,我们应该在开头创建新文件,然后在最后刷新并关闭它。

我想它应该看起来像

observable1.flatMap ( line -> { doMagicHere(line+",") } )
    .subscribe ( line -> { System.out.println(line) },
     ex -> { ex.printStackTrace() }
     )

如果在打开file1时发生错误,我们不应该创建file2(也不要处置它) 如果在处理行时发生错误,则应首先处理file2,然后才应处理file1。 (即使在这个特定的例子中它可以以任何方式工作)

我想我可以使用Observable.using()运算符创建Observable1,我们在第一个参数中打开文件,在第二个参数中创建observable,最后在3d参数中配置(关闭)文件。

我不知道如何应用"使用"第二步中的操作员,或者是否是正确的方法。

感谢任何解决方案或指针(最好是在rxjava 2中)

2 个答案:

答案 0 :(得分:0)

Observable.using()有一个良好的开端。但是,第一个可观察的是:

Observable<Observable<String>> observable1;

通过添加此间接,您可以处理第一个资源无法加载的情况。

interface FileWriter {
  void write(String line);
}
Observable<FileWriter> makeDestinationFile(String filename);

通过引入FileWriter抽象,您可以绑定第二个资源。

observable1.flatMap(
    lineSource -> 
      Observable.combineLatest( lineSource,
      makeDestinationFile(filename),
      ( line, writer ) -> writer.write( line + "," ) )
  .subscribe();

observable1完成时,两个observable都将完成,底层资源将被释放。

答案 1 :(得分:0)

对于后退范围,我使用此代码

  Observable.range(0,10)
        .map { 10 - it }
        .subscribe {
            print(it)
            //emit 10,9,8,...,2,1
        }