java - 使用其他 Observable 过滤 RxJava Observable

标签 java android rx-java rx-android rx-java2

我正在使用 RxAndroid 2.0.1 和 RxJava 2.0.6。

我有两个可观察对象:一个返回 Maybe<MyObject>基于一些字符串(ID)。当返回可选对象时,我必须调用第二个接受 MyObject 实例并返回 Single<Boolean> 的对象。如果对象满足某些条件。然后我可以对对象实例做一些进一步的操作。

我目前的实现如下:

objectDAO.getById(objectId)
    .subscribe(
        myObject -> checkCondition(myObject),
        throwable -> /* Fallback */,
        () -> /* Fallback */
    );

private void checkCondition(final MyObject myObject) {
  otherDAO.checkCondition(myObject)
    .subscribe(
        isTrue -> {
          if (isTrue) {
            // yay! now I can do what I need with myObject instance
          } else {
            /* Fallback */
          }
        },
        throwable -> /* Fallback */
    );
}

现在我想知道如何简化我的代码。我的想法:

  1. 尝试使用zip - 我不能,因为在第一个 Observable 返回 MyObject 之前无法订阅第二个 Observable

  2. 尝试使用filter - 现在的问题是我需要使用阻塞 get 来调用第二个可观察对象。它可能会工作,但看起来像代码味道:

    objectDAO.getById(objectId)
      .filter(myObject ->
        otherDAO.checkCondition(myObject).blockingGet()
      )
      .subscribe(
          myObject -> checkCondition(myObject),
          throwable -> /* Fallback */,
          () -> /* Fallback */
      );
    
  3. 尝试使用flatMap - 第二个可观察对象返回 boolean 值,而我需要返回原始对象。因此,我需要使用 blockingGet 映射代码 fragment 并返回原始对象或 Maybe.empty()

有什么建议可以让代码“干净”(它更小而且仍然清楚内部发生了什么)吗?

最佳答案

你可以做的一件事:

objectDAO.getById(objectId)
    .flatMapSingle(myObject -> otherDAO
        .checkCondition(myObject)
        .map(isTrue -> Pair.create(myObject, isTrue))
    )

然后你有一个Observable<Pair<MyObject, Boolean>>并可以随心所欲地继续:subscribe直接检查Boolean那里,filter通过 boolean 值等。

关于java - 使用其他 Observable 过滤 RxJava Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42951869/

相关文章:

java - 来自字符串表达式的动态 If 条件

Android 应用程序和 Windows Azure 移动服务

android - onClickListener 在我的 Activity 中不起作用

android - 使用 RxAndroidBle (rxJava) 将命令列表发送到设备

java - 我的代码抛出 org.hibernate.ObjectDeletedException 异常

java - 有没有适合初级/中级程序员的好的 java 教程

Android "No such file or directory"错误?

android - MVVM。如何将复杂的数据/命令从域传输到 View

android - RXJava RecyclerView

java.sql.SQLException : Access denied for user 'username' @'localhost' (using pass word: YES)