RxJava操作符实践:4_结合操作之4_andThenWhen

一、描述

使用Pattern和Plan作为中介,将两个或多个Observable发射的数据集合并到一起。

And/Then/When操作符组合的行为类似于zip,但是它们使用一个中间数据结构。接受两个或多个Observable,一次一个将它们的发射物合并到Pattern对象,然后操作那个Pattern对象,变换为一个Plan。随后将这些Plan变换为Observable的发射物。

它们属于rxjava-joins模块,不是核心RxJava包的一部分。

二、示意图

and/then/when

三、示例代码

由于start操作符是属于可选的rxjava-joins模块的,所以需要加入下面的依赖:

1
compile 'io.reactivex:rxjava-joins:0.22.0'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Observable just1 = Observable.just("A", "B");
Observable just2 = Observable.just(1, 2, 3);

Pattern2<String, Integer> pattern = JoinObservable.from(just1).and(just2);
Plan0 plan = pattern.then(new Func2<String, Integer, String>() {
@Override
public String call(String s, Integer integer) {
return s + integer;
}
});

JoinObservable.when(plan)
.toObservable()
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
System.out.println("onCompleted.");
}

@Override
public void onError(Throwable e) {
System.out.println("onError: " + e.getMessage());
}

@Override
public void onNext(String s) {
System.out.println("onNext: " + s);
}
});

四、运行结果

1
2
3
onNext: A1
onNext: B2
onCompleted.

and/then/when操作符实现的效果跟zip一样。相较之下,zip会更简单易用,但是如果是一些zip满足不了的场景,一些比较复杂的架构,就需要用and/then/when操作符来实现了。

项目代码已上传到Github:https://github.com/SherlockShi/RxJavaBestPractise

五、参考资料

ReactiveX官方文档

ReactiveX文档中文翻译

PS:欢迎关注 SherlockShi 个人博客

感谢你的支持,让我继续努力分享有用的技术和知识点!