【问题标题】:RxJava, execute observable only if first was emptyRxJava,仅当 first 为空时才执行 observable
【发布时间】:2015-12-10 06:34:22
【问题描述】:

只有在不存在具有相同电子邮件的用户时,我才想在我的数据库中插入一个新用户。

因此,我有两个 Observable: 第一个发送带有特定电子邮件的用户,或者在不发送任何内容的情况下完成。 第二个 Observable 插入一个新用户并返回这个新创建用户的 Object。

我的问题是,我不希望第一个 Observable(如果存在)发出的用户被传输到订阅者。相反,我想将其映射为 null)。

Observable<UserViewModel> observable = 
    checkAndReturnExistingUserObservable
        .map(existingUser -> null)
        .firstOrDefault(
            insertAndReturnNewUserObservable
                .map(insertedUser -> mMapper.map(insertedUser)
        )

这是我尝试的最后一件事,但它在第二个映射运算符处显示“循环推理”。

总结一下。我只想在第一个完成为空的情况下执行第二个 Observable,但如果不是,我不想返回第一个发出的数据,而是我想返回 null。

非常感谢任何帮助。

【问题讨论】:

  • 我有一个关于运算符的 anwser 用于正确发出您的对象。但是,我不太确定循环推理。您能否发布insertAndReturnNewUserObservablemMapper.map(...) 的代码以确保安全。此外,恕我直言,返回 null 是一个非常糟糕的主意。但我会在看到你的代码后在我的答案中提供详细信息;)

标签: java rx-java


【解决方案1】:

这种操作有switchIfEmpty运算符:

checkAndReturnExistingUserObservable
.switchIfEmpty(insertAndReturnNewUserObservable)

编辑

如果您不需要现有用户,有一个基于 flatMap 的答案,它将第一次检查转换为布尔值并根据其值进行调度:

checkAndReturnExistingUserObservable
.map(v -> true).firstOrDefault(false)
.flatMap(exists -> exists ? Observable.empty() : insertAndReturnNewUserObservable);

【讨论】:

  • 如果为空,他也想发出一个空值,但我认为 switchIfEmpty 是最好的解决方案!
  • 如果用户存在,我不确定为什么 OP 想要 null 但如果需要,您可以在 switchIfEmpty 之前将其映射。 OP 还可以在用户对象本身中使用虚拟用户对象而不是 null 或新标志。否则,有一个基于 flatMap 的答案(现已删除)。
  • 这种方法的问题在于,它还会返回找到的第一个 Observable 的用户(我不想要的)。目前我正在尝试平面地图答案,这似乎以一种干净的方式解决了我的问题。不幸的是,它已被删除,所以我不能接受它是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
相关资源
最近更新 更多