在 RxJava 中,“组合数据流”通常指把多个 Observable / Flowable / Single 等数据源,按某种规则合并、转换或协调后,输出一个新的数据流。下面按常见场景给你系统讲一下。
merge / mergeWith多个流同时发射,按时间顺序合并(不保证顺序)
Observable.merge(
observableA,
observableB
).subscribe(System.out::println);
observableA
.mergeWith(observableB)
.subscribe(...);
✅ 适合:多个独立数据源同时监听
concat / concatWith顺序执行,前一个结束再发下一个
Observable.concat(
observableA,
observableB
)
✅ 适合:有先后依赖(如:先读缓存,再请求网络)
concatEager同时订阅,但按 concat 顺序发射
Observable.concatEager(a, b)
zip一一对应合并多个流
Observable.zip(
observableA,
observableB,
(a, b) -> a + "-" + b
)
✅ 适合:
combineLatest任一流变化,用最新值组合
Observable.combineLatest(
a,
b,
(x, y) -> x + y
)
✅ 适合:
withLatestFrom主流动时,取另一个流最新值
main.withLatestFrom(other, (m, o) -> m + o)
✅ 适合:
flatMap无序、并发
observable.flatMap(item -> request(item))
concatMap有序、串行
observable.concatMap(item -> request(item))
switchMap只保留最新流,取消旧流
editTextChanges.switchMap(query -> search(query))
✅ 适合:搜索联想
amb谁先发射用谁
Observable.ambArray(a, b)
publish + merge一个源被多个订阅者复用
ConnectableObservable<Integer> pm = source.publish();
pm.mergeWith(pm.map(i -> i * 2)).subscribe();
pm.connect();
Observable.concat(
getCache(),
getNetwork()
)
Observable.zip(
api1(),
api2(),
(r1, r2) -> combine(r1, r2)
)
Observable.combineLatest(
name, age,
(n, a) -> n + a
)
| 需求 | 操作符 |
|---|---|
| 同时合并 | merge |
| 顺序执行 | concat |
| 一一对应 | zip |
| 最新组合 | combineLatest |
| 只取最新 | switchMap |
| 串行展开 | concatMap |
| 并行展开 | flatMap |
如果你有具体业务场景(比如:多个接口、搜索、表单、缓存),我可以直接帮你写 RxJava 代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。