# 5. 如何选择操作符？

![](https://4217506537-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWj545abP2yK86-qksJ%2Fsync%2F70f42c76f0140dc3c2613fef2d3f8040d1541b6d.png?generation=1616819385313020\&alt=media)

下面这个**决策树**可以帮助你找到需要的操作符。

## 决策树

**我想要创建一个 `Observable`**

* 产生特定的一个元素：[just](https://3440217568.gitbook.io/rxswift/decision_tree/just)
  * 经过一段延时：[timer](https://3440217568.gitbook.io/rxswift/decision_tree/timer)
* 从一个序列拉取元素：[from](https://3440217568.gitbook.io/rxswift/decision_tree/from)
* 重复的产生某一个元素：[repeatElement](https://3440217568.gitbook.io/rxswift/decision_tree/repeatelement)
* 存在自定义逻辑：[create](https://3440217568.gitbook.io/rxswift/decision_tree/create)
* 每次订阅时产生：[deferred](https://3440217568.gitbook.io/rxswift/decision_tree/deferred)
* 每隔一段时间，发出一个元素：[interval](https://3440217568.gitbook.io/rxswift/decision_tree/interval)
  * 在一段延时后：[timer](https://3440217568.gitbook.io/rxswift/decision_tree/timer)
* 一个空序列，只有一个完成事件：[empty](https://3440217568.gitbook.io/rxswift/decision_tree/empty)
* 一个任何事件都没有产生的序列：[never](https://3440217568.gitbook.io/rxswift/decision_tree/never)

**我想要创建一个 `Observable` 通过组合其他的 `Observables`**

* 任意一个 `Observable` 产生了元素，就发出这个元素：[merge](https://3440217568.gitbook.io/rxswift/decision_tree/merge)
* 让这些 `Observables` 一个接一个的发出元素，当上一个 `Observable` 元素发送完毕后，下一个  `Observable` 才能开始发出元素：[concat](https://3440217568.gitbook.io/rxswift/decision_tree/concat)
* 组合多个 `Observables` 的元素
  * 当每一个 `Observable` 都发出一个新的元素：[zip](https://3440217568.gitbook.io/rxswift/decision_tree/zip)
  * 当任意一个 `Observable` 发出一个新的元素：[combineLatest](https://3440217568.gitbook.io/rxswift/decision_tree/combinelatest)

**我想要转换 `Observable` 的元素后，再将它们发出来**

* 对每个元素直接转换：[map](https://3440217568.gitbook.io/rxswift/decision_tree/map)
* 转换到另一个 `Observable`：[flatMap](https://3440217568.gitbook.io/rxswift/decision_tree/flatmap)
  * 只接收最新的元素转换的 `Observable` 所产生的元素：[flatMapLatest](https://3440217568.gitbook.io/rxswift/decision_tree/flatmaplatest)
  * 每一个元素转换的 `Observable` 按顺序产生元素：[concatMap](https://3440217568.gitbook.io/rxswift/decision_tree/concatmap)
* 基于所有遍历过的元素： [scan](https://3440217568.gitbook.io/rxswift/decision_tree/scan)

**我想要将产生的每一个元素，拖延一段时间后再发出：**[**delay**](https://3440217568.gitbook.io/rxswift/decision_tree/delay)

**我想要将产生的事件封装成元素发送出来**

* 将他们封装成 `Event<Element>`：[materialize](https://3440217568.gitbook.io/rxswift/decision_tree/materialize)
  * 然后解封出来：[dematerialize](https://3440217568.gitbook.io/rxswift/decision_tree/dematerialize)

**我想要忽略掉所有的 `next` 事件，只接收 `completed` 和 `error` 事件：**[**ignoreElements**](https://3440217568.gitbook.io/rxswift/decision_tree/ignoreelements)

**我想创建一个新的 `Observable` 在原有的序列前面加入一些元素：**[**startWith**](https://3440217568.gitbook.io/rxswift/decision_tree/startwith)

**我想从 `Observable` 中收集元素，缓存这些元素之后在发出：**[**buffer**](https://3440217568.gitbook.io/rxswift/decision_tree/buffer)

**我想将 `Observable` 拆分成多个 `Observables`：**[**window**](https://3440217568.gitbook.io/rxswift/decision_tree/window)

* 基于元素的共同特征：[groupBy](https://3440217568.gitbook.io/rxswift/decision_tree/groupby)

**我想只接收 `Observable` 中特定的元素**

* 发出唯一的元素：[single](https://3440217568.gitbook.io/rxswift/decision_tree/single)

**我想重新从 `Observable` 中发出某些元素**

* 通过判定条件过滤出一些元素：[filter](https://3440217568.gitbook.io/rxswift/decision_tree/filter)
* 仅仅发出头几个元素：[take](https://3440217568.gitbook.io/rxswift/decision_tree/take)
* 仅仅发出尾部的几个元素：[takeLast](https://3440217568.gitbook.io/rxswift/decision_tree/takelast)
* 仅仅发出第 n 个元素：[elementAt](https://3440217568.gitbook.io/rxswift/decision_tree/elementat)
* 跳过头几个元素 &#x20;
  * 跳过头 n 个元素：[skip](https://3440217568.gitbook.io/rxswift/decision_tree/skip)
  * 跳过头几个满足判定的元素：[skipWhile](https://3440217568.gitbook.io/rxswift/decision_tree/skipwhile)，[skipWhileWithIndex](https://3440217568.gitbook.io/rxswift/decision_tree/skipwhile)
  * 跳过某段时间内产生的头几个元素：[skip](https://3440217568.gitbook.io/rxswift/decision_tree/skip)
  * 跳过头几个元素直到另一个 `Observable` 发出一个元素：[skipUntil](https://3440217568.gitbook.io/rxswift/decision_tree/skipuntil)
* 只取头几个元素
  * 只取头几个满足判定的元素：[takeWhile](https://3440217568.gitbook.io/rxswift/decision_tree/takewhile)，[takeWhileWithIndex](https://3440217568.gitbook.io/rxswift/decision_tree/takewhile)
  * 只取某段时间内产生的头几个元素：[take](https://3440217568.gitbook.io/rxswift/decision_tree/take)
  * 只取头几个元素直到另一个 `Observable` 发出一个元素：[takeUntil](https://3440217568.gitbook.io/rxswift/decision_tree/takeuntil)
* 周期性的对 `Observable` 抽样：[sample](https://3440217568.gitbook.io/rxswift/decision_tree/sample)
* 发出那些元素，这些元素产生后的特定的时间内，没有新的元素产生：[debounce](https://3440217568.gitbook.io/rxswift/decision_tree/debounce)
* 直到元素的值发生变化，才发出新的元素：[distinctUntilChanged](https://3440217568.gitbook.io/rxswift/decision_tree/distinctuntilchanged)
  * 并提供元素是否相等的判定函数：[distinctUntilChanged](https://3440217568.gitbook.io/rxswift/decision_tree/distinctuntilchanged)
* 在开始发出元素时，延时后进行订阅：[delaySubscription](https://3440217568.gitbook.io/rxswift/decision_tree/delaysubscription)

**我想要从一些 `Observables` 中，只取第一个产生元素的 `Observable`：**[**amb**](https://3440217568.gitbook.io/rxswift/decision_tree/amb)

**我想评估 `Observable` 的全部元素**

* 并且对每个元素应用聚合方法，待所有元素都应用聚合方法后，发出结果：[reduce](https://3440217568.gitbook.io/rxswift/decision_tree/reduce)
* 并且对每个元素应用聚合方法，每次应用聚合方法后，发出结果：[scan](https://3440217568.gitbook.io/rxswift/decision_tree/scan)

**我想把 `Observable` 转换为其他的数据结构：as...**

**我想在某个** [**Scheduler**](https://3440217568.gitbook.io/rxswift/rxswift_core/schedulers) **应用操作符：**[**subscribeOn**](https://3440217568.gitbook.io/rxswift/decision_tree/subscribeon)

* 在某个 [Scheduler](https://3440217568.gitbook.io/rxswift/rxswift_core/schedulers) 监听：[observeOn](https://3440217568.gitbook.io/rxswift/decision_tree/observeon)

**我想要 `Observable` 发生某个事件时, 采取某个行动：**[**do**](https://3440217568.gitbook.io/rxswift/decision_tree/do)

**我想要 `Observable` 发出一个 `error` 事件：**[**error**](https://3440217568.gitbook.io/rxswift/decision_tree/error)

* 如果规定时间内没有产生元素：[timeout](https://3440217568.gitbook.io/rxswift/decision_tree/timeout)

**我想要 `Observable` 发生错误时，优雅的恢复**

* 如果规定时间内没有产生元素，就切换到备选 `Observable` ：[timeout](https://3440217568.gitbook.io/rxswift/decision_tree/timeout)
* 如果产生错误，将错误替换成某个元素 ：[catchErrorJustReturn](https://3440217568.gitbook.io/rxswift/decision_tree/catcherror)
* 如果产生错误，就切换到备选 `Observable` ：[catchError](https://3440217568.gitbook.io/rxswift/decision_tree/catcherror)
* 如果产生错误，就重试 ：[retry](https://3440217568.gitbook.io/rxswift/decision_tree/retry)

**我创建一个 `Disposable` 资源，使它与 `Observable` 具有相同的寿命：**[**using**](https://3440217568.gitbook.io/rxswift/decision_tree/using)

**我创建一个 `Observable`，直到我通知它可以产生元素后，才能产生元素：**[**publish**](https://3440217568.gitbook.io/rxswift/decision_tree/publish)

* 并且，就算是在产生元素后订阅，也要发出全部元素：[replay](https://3440217568.gitbook.io/rxswift/decision_tree/replay)
* 并且，一旦所有观察者取消观察，他就被释放掉：[refCount](https://3440217568.gitbook.io/rxswift/decision_tree/refcount)
* 通知它可以产生元素了：[connect](https://3440217568.gitbook.io/rxswift/decision_tree/connect)
