当前位置: 首页 > 知识库问答 >
问题:

RxJava、副作用和返回void的方法

邵毅
2023-03-14

我已经使用RxJava编写了一个存储库,但在找到处理对repo的写入和删除的最佳方法时遇到了麻烦。

repository
    .fetchData()
    .doOnNext(s -> if (s.equals("something") {
                       repository.writeData(s);
                   }
    )
    .subscribe();

我找到了2个潜在的解决方案,但不确定它们的正确程度:

1)使用observable.just(null)启动一个observable,然后使用doonnext()副作用方法调用存储库的方法。这是可行的,看起来很奇怪,但它允许我使用RxJava,并允许我指定要订阅的线程/要观察的线程,这使得线程处理变得容易,并且允许存储库的API保持不变,这样它仍然返回void。

2)我还可以做一些类似Observable.defer()的事情,然后从defer的调用方法返回Observable.just(repository.deleteData())。如果我这样做,我必须更改存储库的API,以便deleteData方法具有Void返回类型而不是Void(并且该方法添加了return null;来履行方法签名的约定)。这也允许我使用RxJava,指定我要观察和订阅的线程,并继续使用Observable即使我真正做的是一个副作用。

RxJava有没有办法创建一个Observable,它调用一个返回类型为void的方法,该方法在副作用方法之外运行同步代码?

共有1个答案

子车高歌
2023-03-14

为什么不是这样的呢?

public static <T> Observable<T> observeCompletion(Runnable r) {
   return Observable.defer(() -> {
         r.run();
         return Observable.empty();
   };
}

现在,您可以通过onSubscribe执行所需的线程跳转,并将所有内容保存在RX中。

 类似资料:
  • 我注意到,在使用扫描仪时,如果我想设置定界符或区域设置等属性,那么这样做的方法会返回扫描仪对象本身: 我不明白的是,如果属性被更改(而不是创建新对象),为什么它返回一个扫描器对象而不是void?这并不是说我必须将返回值存储在一个变量中——事实上,如果我尝试这样做,就像下面的代码中那样,Eclipse将发出消息:“lineScanner”在此位置未关闭:

  • 我有以下问题:有一个计算两个整数之间相似性的布尔静态方法,我被要求返回4个结果: 在不更改方法的返回类型的情况下,它应该保持布尔值。 不更新/使用外部变量和对象的值

  • 我有这门课(简体) 我试图模拟writeToFile方法,但没有成功 这个结果随着去到原来的方法,我也尝试了模拟具体的方法使用: 编辑:修复导入问题后,正如@pvpkiran所说,现在起作用了!我可以用DoAnswer来验证。

  • 我相信这是一个愚蠢的问题,但我已经讨论了很久了。。我试图创建一个java程序,根据用户输入的年数和金额计算复利。但我一直遇到一个错误,void方法无法返回值。因此,我将方法切换为double,因为这是将返回的内容,但它告诉我double方法必须返回double。即使我在循环中返回一个双倍。。。请帮忙

  • 我想创建一个任务来运行串行命令。此时,我不需要从正在进行工作的方法返回任何内容。这可能会在以后发生变化,但我现在很好奇这是如何发生的。 这就是我所拥有的。我想为任务使用单独的方法,而不是创建匿名操作。我尝试返回void,结果是“void不能显式转换为任务”。我也试过了<代码>任务 在此过程中,我使用了一个线程来完成这项任务,但这次我想使用任务。 预计到达时间: 最后,这是我的完整解决方案

  • 我有下面的课,我试图测试。我遇到问题的方法是,因为我试图存根/模拟行为,然后在测试中验证行为。