【发布时间】:2018-07-18 10:40:23
【问题描述】:
我正在使用 RxJava 处理我们从队列中提取的一些通知。
RxJava 似乎在一个简单的工作流程上工作得很好,现在随着新需求的出现,流程变得越来越复杂,分支越来越多(请参见下图作为参考) 我试图用一个小单元测试来举例说明流程:
@Test
public void test() {
Observable.range(1, 100)
.groupBy(n -> n % 3)
.toMap(GroupedObservable::getKey)
.flatMap(m1 -> {
Observable<Integer> ones1 = m1.get(0);
Observable<Integer> twos1 = m1.get(1).map(n -> n - 10);
Observable<Integer> threes = m1.get(2).map(n -> n + 100);
Observable<Integer> onesAndTwos = Observable.merge(ones1, twos1)
.map(n -> n * 3)
.groupBy(n -> n % 2)
.toMap(GroupedObservable::getKey)
.flatMap(m2 -> {
Observable<Integer> ones2 = m2.get(0).map(n -> n * 10);
Observable<Integer> twos2 = m2.get(1).map(n -> n * 100);
return Observable.merge(ones2, twos2);
});
return Observable.merge(onesAndTwos, threes).map(n -> n +1);
})
.subscribe(System.out::println);
}
虽然使用 RxJava 在技术上仍然可以实现,但我现在想知道这是否是一个不错的选择,因为要正式化分支,我必须在主 flatMap 内进行 2 级嵌套,这看起来不太整洁。
这是描述上述工作流程的正确方式吗?还是 RxJava 不适合分支工作流?
感谢您的帮助!
【问题讨论】:
-
请注意,没有什么会限制您在单个表达式中生成这样的 Rx 图。您可以轻松地将流程中内部点的可观察值存储在变量或字段中,然后单独使用它们。这可以让您将此流程拆分为更清晰的模块,而不是将其显示为一个整体,这至少有点令人生畏。
-
确实如此。但我也想知道在 RxJava 中是否有更好的方法来处理分支,也许是使用本地操作符。最后的要点是,在
groupBy之后,我需要同时处理所有组,这样我就可以一起操作它们。这就是我使用toMap的原因,但这也是创建嵌套的原因。也许有更好的方法?
标签: java functional-programming rx-java reactive-programming rx-java2