RxJava null字段和选项

时间:2017-09-19 10:53:45

标签: android rx-android rx-java2

我有一点哲学(或者可能只是无知)的问题。

基本上问题是:我们或者不应该“完全被动”,“完全被动”是什么意思?

一个简单的例子,说明为什么我会想到这个问题。

想象一下,我们进行API调用,某些元素可能为null。例如:

Observable<Result<Profile>> loadUserProfile(@Nullable String userId)

注意:结果是操作的状态(LOADING,SUCCESS,ERROR)

现在,据我所知,我们可以通过两个选项来处理userId的可空性:(注意:我在这里使用伪代码)

选项1:有点不是“完全被动”?

Observable<Result<Profile>> loadUserProfile(@Nullable String userId) {
  if (userId is null) {
     return Result.error("Something really bad is happening");
  } else {
     return ProfileApi.loadUserProfile(userId)
             .map(profile -> Result.success(profile);
  }
}

选项2:使用可选值(https://medium.com/@joshfein/handling-null-in-rxjava-2-0-10abd72afa0b)接近用例

Observable<Result<Profile>> loadUserProfile(@Nullable String userId) {
   return Observable.just(new Optional<>(userId))
      .flatMap(ProfileApi.loadUserProfile(userId))
      .map(profile -> Result.success(profile)
}

对于这两种情况,userId为null的结果是发送Result.error(“发生了非常糟糕的事情”)

您更喜欢哪种选择?或者您可能更喜欢选项3 [在此处插入选项]

对不起,如果这是一个愚蠢的问题。我觉得它是,但我们会看到:) 无论如何感谢阅读。

结论:到目前为止,从已经讨论的内容来看,似乎任何一种方法都被认为是反应方式,而这只是你认为它最适合你的编码风格的问题。

1 个答案:

答案 0 :(得分:0)

您面临的问题是基于存在可空性。所以,让我们假设一些事情:

  

所有不期望的都是错误,因此它应该抛出异常

基于这个前提,这成为一个容易回答的问题。以下是您的示例:

Observable<Result<Profile>> loadUserProfile(@Nullable String userId) {
  if (userId is null) {
     return Observable.error(new UserIdIsNullException())
  } else {
     return ProfileApi.loadUserProfile(userId)
             .map(profile -> Result.success(profile);
  }
}

这样您就可以充分利用Observable的所有力量。您只需要在UI中捕获这些错误并呈现相应的状态