RxJava——操作符详解

RxJava 操作符详解(2025-2026 实用版)

RxJava 的操作符(Operators)是其最核心、最强大的部分。理解操作符的分类和使用场景,比死记硬背单个操作符的名字更重要。

下面按实际使用频率场景重要性排序,列出最常被问到、最常被用到的操作符,并标注典型使用场景、注意事项以及容易混淆的点。

一、最核心的分类与高频操作符一览表

分类核心作用高频操作符(按使用频率排序)面试/项目出现频率
创建型如何产生 Observablejust / fromArray / fromIterable / range / interval / timer / create / defer / empty / never★★★★★
转换型改变数据流中的元素map / flatMap / concatMap / switchMap / flatMapIterable / buffer / window / groupBy★★★★★
过滤型筛选元素filter / take / takeLast / first / last / skip / elementAt / distinct / debounce / throttle★★★★☆
组合型把多个 Observable 合并zip / combineLatest / merge / concat / amb / startWith / withLatestFrom★★★★☆
数学/聚合型对序列做统计count / reduce / collect / average / max / min / sum★★★☆☆
辅助型调试、延迟、错误处理doOnNext / doOnError / doOnComplete / doOnSubscribe / onErrorReturn / onErrorResumeNext★★★★☆
线程调度控制上游/下游线程subscribeOn / observeOn★★★★★
背压控制处理 Flowable 背压onBackpressureBuffer / onBackpressureDrop / onBackpressureLatest / onBackpressureError★★★★☆(Flowable)
条件/布尔型条件判断、序列控制all / any / contains / sequenceEqual / skipUntil / takeUntil / takeWhile / skipWhile★★★☆☆
连接型控制何时开始发射publish / connect / refCount / replay / cache / share★★★☆☆

二、真正高频、面试必考的操作符详解(Top 12)

1. map / flatMap / concatMap / switchMap

操作符一句话说明常见使用场景容易踩的坑 / 面试题
map1:1 转换元素类型转换、字段提取、计算
flatMap1:N 转换 + 展平(无序)网络请求嵌套、列表扁平化顺序不保证,适合“谁快用谁”场景
concatMap1:N 转换 + 展平(严格保持顺序)需要严格顺序的嵌套请求性能比 flatMap 差(必须等前一个完成)
switchMap最新数据源优先(旧的取消)搜索框输入防抖、切换 Tab 刷新数据经典面试题:搜索框实现(防抖 + 最新请求优先)

经典代码对比

// 搜索框防抖 + 最新请求优先
searchEditText.textChanges()
    .debounce(300, TimeUnit.MILLISECONDS)
    .switchMap(query -> api.search(query))
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(...);

2. zip / combineLatest / withLatestFrom

操作符发射时机典型场景面试高频题
zip所有源都发射一个才发射多个接口同时请求,等齐了再显示(登录+用户信息)“两个接口并发请求,等都成功才跳转页面”
combineLatest任意一个源发射就用最新的其他源组合表单验证(用户名+密码都输入了才亮按钮)“实时计算两个输入框的和”
withLatestFrom被观察者发射时,取观察者的最新值点击按钮时取最新的配置/状态“点击发送时带上最新的 token”

3. merge / concat / amb

操作符合并方式适用场景
merge无序,谁发射快用谁多个数据源,谁先到显示谁(新闻列表)
concat严格按顺序,先完成一个再下一个广告 → 正文 → 评论(顺序必须保证)
amb哪个先发射就只用哪个多个服务器取最快响应的那个(竞速)

4. defer / interval / timer / range

操作符特点典型用法
defer直到订阅才创建 Observable每次订阅都产生新数据(避免冷 Observable 共享状态)
interval每隔一段时间发射递增数字轮询、倒计时、心跳
timer延迟一段时间后发射 0L延迟执行、节流后操作
range发射一段连续整数生成测试数据、分页循环

5. 线程调度(必考)

Observable.just(1,2,3,4)
    .subscribeOn(Schedulers.io())          // 上游(数据产生)线程
    .observeOn(AndroidSchedulers.mainThread()) // 下游(消费)线程
    .map(...) 
    .subscribe(...);

记住一句话

subscribeOn 只生效一次(最上游的那个),observeOn 可以多次切换下游线程。

6. 错误处理操作符(生产必备)

操作符作用使用场景
onErrorReturn错误时返回一个值,继续完成网络错误时返回缓存数据
onErrorResumeNext错误时切换到另一个 Observable主接口挂了,切备用接口
onErrorReturnItem错误时返回单个值简单降级
retry / retryWhen重试机制网络请求重试
onExceptionResumeNext只捕获 Exception(不捕获 Error)更安全的错误恢复

三、2025-2026 年面试最常问的 RxJava 操作符组合题

  1. 搜索框防抖 + 最新请求优先 + 线程切换
  2. 并发请求两个接口,等齐了再显示(zip)
  3. 多个接口,谁先返回显示谁(merge / amb)
  4. 表单实时校验(combineLatest)
  5. 轮询接口,每 5 秒一次(interval + flatMap)
  6. 点击按钮时带上最新的 token(withLatestFrom)
  7. 嵌套请求需要严格顺序(concatMap)
  8. 错误时返回默认值或降级数据(onErrorReturn / onErrorResumeNext)

四、快速记忆口诀(背下来很有用)

  • 想改变元素 → map / flatMap / concatMap / switchMap
  • 想合并多个流 → zip(等齐)、combineLatest(最新组合)、merge(无序快)、concat(顺序)
  • 想控制发射时机 → defer / publish / replay / cache
  • 想处理错误 → onErrorReturn / onErrorResumeNext / retry
  • 想控制线程 → subscribeOn(一次) / observeOn(多次)

你现在最想针对哪个操作符或场景来深入?

  • 手写一个完整的搜索防抖 + 错误重试的链式调用?
  • flatMap / concatMap / switchMap 三者的详细对比 + 动图解释?
  • retryWhen 的高级用法(指数退避重试)?
  • Flowable 背压场景下的操作符选择?
  • 还是来几道经典 RxJava 面试手撕题?

告诉我你的需求,我继续陪你把 RxJava 操作符玩透~

文章已创建 4323

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部