# 4.4 Operator - 操作符

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

**操作符**可以帮助大家创建新的序列，或者变化组合原有的序列，从而生成一个新的序列。

我们之前在[输入验证](https://3440217568.gitbook.io/rxswift/first_app)例子中就多次运用到操作符。例如，通过 [map](https://3440217568.gitbook.io/rxswift/decision_tree/map) 方法将**输入的用户名**，转换为**用户名是否有效**。然后用这个转化后来的序列来控制红色提示语是否隐藏。我们还通过 [combineLatest](https://3440217568.gitbook.io/rxswift/decision_tree/combinelatest) 方法，将**用户名是否有效**和**密码是否有效**合并成**两者是否同时有效**。然后用这个合成后来的序列来控制按钮是否可点击。

这里 [map](https://3440217568.gitbook.io/rxswift/decision_tree/map) 和 [combineLatest](https://3440217568.gitbook.io/rxswift/decision_tree/combinelatest) 都是**操作符**，它们可以帮助我们构建所需要的序列。现在，我们再来看几个例子：

## [filter](https://3440217568.gitbook.io/rxswift/decision_tree/filter) - 过滤

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

你可以用 [filter](https://3440217568.gitbook.io/rxswift/decision_tree/filter) 创建一个新的序列。这个序列只发出温度大于 33 度的元素。

## [map](https://3440217568.gitbook.io/rxswift/decision_tree/map) - 转换

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

你可以用 [map](https://3440217568.gitbook.io/rxswift/decision_tree/map) 创建一个新的序列。这个序列将原有的 **JSON** 转换成 **Model** 。这种转换实际上就是解析 **JSON** 。

## [zip](https://3440217568.gitbook.io/rxswift/decision_tree/zip) - 配对

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

你可以用 [zip](https://3440217568.gitbook.io/rxswift/decision_tree/zip) 来合成一个新的序列。这个序列将汉堡序列的元素和薯条序列的元素配对后，生成一个新的套餐序列。

## 如何使用操作符

使用操作符是非常容易的。你可以直接调用实例方法，或者静态方法：

* 温度过滤

  ```swift
  // 温度
  let rxTemperature: Observable<Double> = ...

  // filter 操作符
  rxTemperature.filter { temperature in temperature > 33 }
      .subscribe(onNext: { temperature in
          print("高温：\(temperature)度")
      })
      .disposed(by: disposeBag)
  ```
* 解析 JSON

  ```swift
  // JSON
  let json: Observable<JSON> = ...

  // map 操作符
  json.map(Model.init)
      .subscribe(onNext: { model in
          print("取得 Model: \(model)")
      })
      .disposed(by: disposeBag)
  ```
* 合成套餐

  ```swift
  // 汉堡
  let rxHamburg: Observable<Hamburg> = ...
  // 薯条
  let rxFrenchFries: Observable<FrenchFries> = ...

  // zip 操作符
  Observable.zip(rxHamburg, rxFrenchFries)
      .subscribe(onNext: { (hamburg, frenchFries) in
          print("取得汉堡: \(hamburg) 和薯条：\(frenchFries)")
      })
      .disposed(by: disposeBag)
  ```

## 决策树

[Rx](https://github.com/Reactive-Extensions/Rx.NET) 提供了充分的**操作符**来帮我们创建序列。当然如果内置操作符无法满足你的需求时，你还可以创建自定义的操作符。

如果你不确定该如何选择操作符，可以参考 [决策树](https://3440217568.gitbook.io/rxswift/decision_tree)。它会引导你找出合适的操作符。

## 操作符列表

> 26个英文字母我都认识，可是连成一个句子我就不怎么认得了...

这里提供一个操作符列表，它们就好比是**26个英文字母**。你如果要将它们的作用全部都发挥出来，是需要学习如何将它们**连成一个句子**的：

* [amb](https://3440217568.gitbook.io/rxswift/decision_tree/amb)
* [buffer](https://3440217568.gitbook.io/rxswift/decision_tree/buffer)
* [catchError](https://3440217568.gitbook.io/rxswift/decision_tree/catcherror)
* [combineLatest](https://3440217568.gitbook.io/rxswift/decision_tree/combinelatest)
* [concat](https://3440217568.gitbook.io/rxswift/decision_tree/concat)
* [concatMap](https://3440217568.gitbook.io/rxswift/decision_tree/concatmap)
* [connect](https://3440217568.gitbook.io/rxswift/decision_tree/connect)
* [create](https://3440217568.gitbook.io/rxswift/decision_tree/create)
* [debounce](https://3440217568.gitbook.io/rxswift/decision_tree/debounce)
* [debug](https://3440217568.gitbook.io/rxswift/decision_tree/debug)
* [deferred](https://3440217568.gitbook.io/rxswift/decision_tree/deferred)
* [delay](https://3440217568.gitbook.io/rxswift/decision_tree/delay)
* [delaySubscription](https://3440217568.gitbook.io/rxswift/decision_tree/delaysubscription)
* [dematerialize](https://3440217568.gitbook.io/rxswift/decision_tree/dematerialize)
* [distinctUntilChanged](https://3440217568.gitbook.io/rxswift/decision_tree/distinctuntilchanged)
* [do](https://3440217568.gitbook.io/rxswift/decision_tree/do)
* [elementAt](https://3440217568.gitbook.io/rxswift/decision_tree/elementat)
* [empty](https://3440217568.gitbook.io/rxswift/decision_tree/empty)
* [error](https://3440217568.gitbook.io/rxswift/decision_tree/error)
* [filter](https://3440217568.gitbook.io/rxswift/decision_tree/filter)
* [flatMap](https://3440217568.gitbook.io/rxswift/decision_tree/flatmap)
* [flatMapLatest](https://3440217568.gitbook.io/rxswift/decision_tree/flatmaplatest)
* [from](https://3440217568.gitbook.io/rxswift/decision_tree/from)
* [groupBy](https://3440217568.gitbook.io/rxswift/decision_tree/groupby)
* [ignoreElements](https://3440217568.gitbook.io/rxswift/decision_tree/ignoreelements)
* [interval](https://3440217568.gitbook.io/rxswift/decision_tree/interval)
* [just](https://3440217568.gitbook.io/rxswift/decision_tree/just)
* [map](https://3440217568.gitbook.io/rxswift/decision_tree/map)
* [merge](https://3440217568.gitbook.io/rxswift/decision_tree/merge)
* [materialize](https://3440217568.gitbook.io/rxswift/decision_tree/materialize)
* [never](https://3440217568.gitbook.io/rxswift/decision_tree/never)
* [observeOn](https://3440217568.gitbook.io/rxswift/decision_tree/observeon)
* [publish](https://3440217568.gitbook.io/rxswift/decision_tree/publish)
* [reduce](https://3440217568.gitbook.io/rxswift/decision_tree/reduce)
* [refCount](https://3440217568.gitbook.io/rxswift/decision_tree/refcount)
* [repeatElement](https://3440217568.gitbook.io/rxswift/decision_tree/repeatelement)
* [replay](https://3440217568.gitbook.io/rxswift/decision_tree/replay)
* [retry](https://3440217568.gitbook.io/rxswift/decision_tree/retry)
* [sample](https://3440217568.gitbook.io/rxswift/decision_tree/sample)
* [scan](https://3440217568.gitbook.io/rxswift/decision_tree/scan)
* [shareReplay](https://3440217568.gitbook.io/rxswift/decision_tree/sharereplay)
* [single](https://3440217568.gitbook.io/rxswift/decision_tree/single)
* [skip](https://3440217568.gitbook.io/rxswift/decision_tree/skip)
* [skipUntil](https://3440217568.gitbook.io/rxswift/decision_tree/skipuntil)
* [skipWhile](https://3440217568.gitbook.io/rxswift/decision_tree/skipwhile)
* [startWith](https://3440217568.gitbook.io/rxswift/decision_tree/startwith)
* [subscribeOn](https://3440217568.gitbook.io/rxswift/decision_tree/subscribeon)
* [take](https://3440217568.gitbook.io/rxswift/decision_tree/take)
* [takeLast](https://3440217568.gitbook.io/rxswift/decision_tree/takelast)
* [takeUntil](https://3440217568.gitbook.io/rxswift/decision_tree/takeuntil)
* [takeWhile](https://3440217568.gitbook.io/rxswift/decision_tree/takewhile)
* [timeout](https://3440217568.gitbook.io/rxswift/decision_tree/timeout)
* [timer](https://3440217568.gitbook.io/rxswift/decision_tree/timer)
* [using](https://3440217568.gitbook.io/rxswift/decision_tree/using)
* [window](https://3440217568.gitbook.io/rxswift/decision_tree/window)
* [withLatestFrom](https://3440217568.gitbook.io/rxswift/decision_tree/withlatestfrom)
* [zip](https://3440217568.gitbook.io/rxswift/decision_tree/zip)
