【问题标题】:RxJava null fields and optionalsRxJava 空字段和可选项
【发布时间】:2017-09-20 16:30:16
【问题描述】:

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

基本上问题是:我们应该还是不应该采用“全反应式”,“全反应式”是什么意思?

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

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

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

注意:结果是操作的状态(加载、成功、错误)

现在,据我所知,我们可以通过两个选项来处理 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("Something really bad occurred")

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

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

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

【问题讨论】:

  • 用户是否有可能拥有空 id?如果发生这种情况,您对应用程序的期望是什么(null id)?
  • 我以 userId 为例。本来可以有不同的东西。
  • 所以,“我们应该,还是不应该......”取决于您的期望。
  • 对于我描述的用例,我们假设 userId 可以为空。
  • 好的,那么如果 userId 为空,你的应用程序会发生什么?在这种情况下你期望什么”?

标签: android rx-android rx-java2


【解决方案1】:

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

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

基于这个前提,这成为一个容易回答的问题。按照你的例子:

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);
  }
}

这样您就可以使用Observables 的所有功能。您只需要在 UI 中捕获这些错误并呈现相应的状态

【讨论】:

  • 您所做的选项是选项 2 所做的事情(如我发送的链接中所示)。基本上,如果 userId 为空,它会引发异常。但现在问题来了:如果我们想制作一个完全反应式的应用程序,那不是打破了这个概念吗?所以只是反应它应该是流的一部分,带有围绕 userId 的 Optional 对象
  • 抛出错误只是您的反应式工具箱中的另一个工具。你可以让它通过你的所有管道,直到它到达 subscribe 方法,或者你可以更早地抓住它,优雅地处理它并将它转换成适合你的流的东西
  • 所以基本上只要返回符合反应流的东西,进行 if 就没有害处。
猜你喜欢
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
相关资源
最近更新 更多