java - 我应该如何在 RxJava 中建模流程?

标签 java design-patterns rx-java reactive-programming rx-java2

假设我有一些过程,例如下载文件或运行大型计算。

它触发的事件可能如下所示:

{ progress: "0%" }
{ progress: "23%" }
{ progress: "78%" }
{ progress: "100%" }
{ content: "Hello. world. " }

或者也许:

{ progress: "0%" }
{ progress: "23%" }
{ error: "Access denied. " }

在每种情况下,我们都有 n状态更新 ( T ) 后跟结果 ( S ) 或错误 ( Throwable ):

T* ( S | Throwable )

进程是 Observable<T> 的组合和Single<S>

有几种使用 Rx 原语对流程进行建模的方法:

  • 一对 Observable<T>Single<S>
  • Observable<Either<T, S>>
  • Observable<Object>instanceof征集选角
  • 一个新的原语 Process<T, S>toObservabletoSingle方法
  • 等等...

过去是如何成功建模的?

哪些方法最好?何时应该使用它们?

最佳答案

让我们立即排除 Objectinstanceof 的情况。这是通往疯狂的必经之路。

这取决于您将如何使用 TS 结果。我相信T应该是S的容器。

class T<S> {
  public boolean isSuccess() { ... }
  public boolean isStatus() { ... }
  public Status getStatus() { ... }
  public S getResult() { ... }
}

发出值的初始流仅包含状态值(进度量),而流中的最后一项则带有 S 值。

如果您需要S成为Single,那么

observable
  .filter( t -> t.isSuccess() )
  .last()
  .map( t -> t.getResult() )
  .toSingle()

就足够了。如果您需要状态报告出现在其他地方,请使用

observable.filter( t-> t.isStatus() )

这给了你你的

关于java - 我应该如何在 RxJava 中建模流程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44203601/

相关文章:

java - Java Socket/Client 之间无法读写

java - 如何在 Eclipse 中使用 Weblogic?

design-patterns - 聚合 ID 设计模式

JavaScript:模块模式差异

python - 查找应该相等的不同字符串之间的相等性

java - spring mvc 与 react 流集成

java - 每个任意数量的整数的出现次数 (Java) - 构建未运行的类

java - Java 中的 try-with-resources 语句

android - 从 recyclerview 的适配器访问父 fragment 方法

android - 为什么 RxJava 经常与 Retrofit 一起使用?