這一節解釋 [`BlockingObservable`](http://reactivex.io/RxJava/javadoc/rx/observables/BlockingObservable.html) 的子類. 一個阻塞的Observable 繼承普通的Observable類,增加了一些可用于阻塞Observable發射的數據的操作符。
要將普通的`Observable` 轉換為 `BlockingObservable`,可以使用 [`Observable.toBlocking(?)`](http://reactivex.io/RxJava/javadoc/rx/Observable.html#toBlocking()) 方法或者[`BlockingObservable.from(?)`](http://reactivex.io/RxJava/javadoc/rx/observables/BlockingObservable.html#from(rx.Observable)) 方法。
* [**`forEach(?)`**](Subscribe.md) — 對Observable發射的每一項數據調用一個方法,會阻塞直到Observable完成
* [**`first(?)`**](First.md) — 阻塞直到Observable發射了一個數據,然后返回第一項數據
* [**`firstOrDefault(?)`**](First.md) — 阻塞直到Observable發射了一個數據或者終止,返回第一項數據,或者返回默認值
* [**`last(?)`**](Last.md) — 阻塞直到Observable終止,然后返回最后一項數據
* [**`lastOrDefault(?)`**](Last.md) — 阻塞直到Observable終止,然后返回最后一項的數據,或者返回默認值
* [**`mostRecent(?)`**](First.md) — 返回一個總是返回Observable最近發射的數據的iterable
* [**`next(?)`**](TakeLast.md) — 返回一個Iterable,會阻塞直到Observable發射了另一個值,然后返回那個值
* [**`latest(?)`**](First.md) — 返回一個iterable,會阻塞直到或者除非Observable發射了一個iterable沒有返回的值,然后返回這個值
* [**`single(?)`**](First.md) — 如果Observable終止時只發射了一個值,返回那個值,否則拋出異常
* [**`singleOrDefault(?)`**](First.md) — 如果Observable終止時只發射了一個值,返回那個值,否則否好默認值
* [**`toFuture(?)`**](To.md) — 將Observable轉換為一個Future
* [**`toIterable(?)`**](To.md) — 將一個發射數據序列的Observable轉換為一個Iterable
* [**`getIterator(?)`**](To.md) — 將一個發射數據序列的Observable轉換為一個Iterator
> 伴隨這個解釋還有一個修改版的彈珠圖,表示阻塞Observable的彈珠圖:

## BlockingObservable的方法
`BlockingObservable`的方法不是將一個Observable變換為另一個,也不是過濾Observables,它們會打斷Observable的調用鏈,會阻塞等待直到Observable發射了想要的數據,然后返回這個數據(而不是一個Observable)。
要將一個Observable轉換為一個`BlockingObservable`,你可以使用`Observable.toBlocking`或`BlockingObservable.from`方法。
* Javadoc: [Observable.toBlocking()](http://reactivex.io/RxJava/javadoc/rx/Observable.html#toBlocking())
* Javadoc: [BlockingObservable.from(Observable)](http://reactivex.io/RxJava/javadoc/rx/observables/BlockingObservable.html#from(rx.Observable))
### first

要獲取`BlockingObservable`的發射物,使用無參數的`first`方法。
* Javadoc: [BlockingObservable.first()](http://reactivex.io/RxJava/javadoc/rx/observables/BlockingObservable.html#first())
### first.p

你也可以給`first`方法傳遞一個謂詞函數用于獲取滿足條件的`BlockingObservable`。
* Javadoc: [BlockingObservable.first(Func1)](http://reactivex.io/RxJava/javadoc/rx/observables/BlockingObservable.html#first(rx.functions.Func1))
### firstOrDefault

和過濾操作符一樣,如果原始Observable沒有數據,`first`會拋出異常`NoSuchElementException`,`firstOrDefault`會返回一個默認值。
* Javadoc: [BlockingObservable.firstOrDefault()](http://reactivex.io/RxJava/javadoc/rx/observables/BlockingObservable.html#firstOrDefault(T))
### firstOrDefault.p

`firstOrDefault`同樣也接受一個謂詞函數作為參數,用于獲取滿足條件的第一項,如果沒有滿足條件的就返回默認值。
* Javadoc: [BlockingObservable.firstOrDefault(T, Func1)](http://reactivex.io/RxJava/javadoc/rx/observables/BlockingObservable.html#firstOrDefault(T,%20rx.functions.Func1))
### single

`single`和`first`類似,但是如果不是正好發射一個數據,會拋出異常`NoSuchElementException`。其它幾個變體的功能也是類似的。
* Javadoc: [single()](http://reactivex.io/RxJava/javadoc/rx/observables/BlockingObservable.html#single())
### single.p

同上,接受一個謂詞函數,如果滿足條件的不是正好一個,會拋出異常。
* Javadoc: [single(Func1)](http://reactivex.io/RxJava/javadoc/rx/observables/BlockingObservable.html#single(rx.functions.Func1))
### singleOrDefault

類似`firstOrDefault`,在為空時返回默認值,超過一個就拋出異常。
* Javadoc: [singleOrDefault(T)](http://reactivex.io/RxJava/javadoc/rx/observables/BlockingObservable.html#singleOrDefault(T))
### singleOrDefault.p

類似`firstOrDefault`,接受一個謂詞函數,如果沒有復合條件的,返回默認值;如果有多個復合條件的,以錯誤通知終止。
* Javadoc: [singleOrDefault(Func1,T)](http://reactivex.io/RxJava/javadoc/rx/observables/BlockingObservable.html#singleOrDefault(rx.functions.Func1,%20T))
### next

`next`操作符會阻塞直到`BlockingObservable`返回另外一個值,然后它返回那個值。你可以重復調用這個方法從`BlockingObservable`獲取后續的數據項。以阻塞的方式高效的迭代獲取它的發射物。
`latest`操作符也是類似的,但是它不會阻塞等待下一個值,它立即返回最近發射的數據項,只在Observable還沒有發射任何數據時會阻塞。
* Javadoc: [next()](http://reactivex.io/RxJava/javadoc/rx/observables/BlockingObservable.html#next())
* Javadoc: [latest()](http://reactivex.io/RxJava/javadoc/rx/observables/BlockingObservable.html#latest())
### mostRecent

`mostRecent`操作符讓你可以用類似的方式迭代一個`BlockingObservable`,但是它總是立即返回一個值,或者是默認值(如果`BlockingObservable`還沒有發射任何數據),或者是`BlockingObservable`最近發射的數據項。
* Javadoc: [mostRecent(T)](http://reactivex.io/RxJava/javadoc/rx/observables/BlockingObservable.html#mostRecent(T))
### forEach
`BlockingObservable`類中也有一個類似的叫作`forEach`的方法。要使用這個方法,你首先需要使用`BlockingObservable.from`方法或`Observable.toBlocking`操作符將原始Observable轉換為一個`BlockingObservable`。
`BlockingObservable.forEach`接受單個函數作為參數,這個函數的作用類似于普通Observable訂閱中的`onNext`函數。`forEach`自身會阻塞知道`BlockingObservable`完成,當它不阻塞時就是完成了,不是通過調用一個回調方法表示它完成了。如果遇到了錯誤它將拋出一個`RuntimeException`(而不是調用一個類似于`onError`的回調方法)。
* Javadoc: [BlockingObservable.forEach(Action1)](http://reactivex.io/RxJava/javadoc/rx/observables/BlockingObservable.html#forEach(rx.functions.Action1))
#### 參見:
* javadoc: <a href="http://reactivex.io/RxJava/javadoc/rx/observables/BlockingObservable.html">`BlockingObservable`</a>
* javadoc: <a href="http://reactivex.io/RxJava/javadoc/rx/Observable.html#toBlocking()">`toBlocking()`</a>
* javadoc: <a href="http://reactivex.io/RxJava/javadoc/rx/observables/BlockingObservable.html#from(rx.Observable)">`BlockingObservable.from()`</a>
## 附錄:相似的阻塞和非阻塞操作符列表
<table>
<thead>
<tr><th rowspan="2">操作符</th><th colspan="3">執行結果</th><th rowspan="2">Rx.NET等價操作</th></tr>
<tr><th>發射多個數據的Observable</th><th>發射單個數據的Observable</th><th>不發射數據的Observable</th></tr>
</thead>
<tbody>
<tr><td><code>Observable.first</code></td><td> 第一項</td><td>單個數據</td><td><i>該元素不存在</i></td><td><code>firstAsync</code></td></tr>
<tr><td><code>BlockingObservable.first</code></td><td> 第一項</td><td>單個數據</td><td><i>該元素不存在</i></td><td><code>first</code></td></tr>
<tr><td><code>Observable.firstOrDefault</code></td><td> 第一項</td><td>單個數據</td><td>默認數據</td><td><code>firstOrDefaultAsync</code></td></tr>
<tr><td><code>BlockingObservable.firstOrDefault</code></td><td> 第一項</td><td>單個數據</td><td>默認數據</td><td><code>firstOrDefault</code></td></tr>
<tr><td><code>Observable.last</code></td><td>最后一項</td><td>單個數據</td><td><i>該元素不存在</i></td><td><code>lastAsync</code></td></tr>
<tr><td><code>BlockingObservable.last</code></td><td>最后一項</td><td>單個數據</td><td><i>該元素不存在</i></td><td><code>last</code></td></tr>
<tr><td><code>Observable.lastOrDefault</code></td><td>最后一項</td><td>單個數據</td><td>默認數據</td><td><code>lastOrDefaultAsync</code></td></tr>
<tr><td><code>BlockingObservable.lastOrDefault</code></td><td>最后一項</td><td>單個數據</td><td>默認數據</td><td><code>lastOrDefault</code></td></tr>
<tr><td><code>Observable.single</code></td><td><i>非法參數</i></td><td>單個數據</td><td><i>該元素不存在</i></td><td><code>singleAsync</code></td></tr>
<tr><td><code>BlockingObservable.single</code></td><td><i>非法參數</i></td><td>單個數據</td><td><i>該元素不存在</i></td><td><code>single</code></td></tr>
<tr><td><code>Observable.singleOrDefault</code></td><td><i>非法參數</i></td><td>單個數據</td><td>默認數據</td><td><code>singleOrDefaultAsync</code></td></tr>
<tr><td><code>BlockingObservable.singleOrDefault</code></td><td><i>非法參數</i></td><td>單個數據</td><td>默認數據</td><td><code>singleOrDefault</code></td></tr>
</tbody>
</table>
- ReactiveX
- Observables
- Single
- Subject
- Scheduler
- Operators
- 創建操作
- Create
- Defer
- Empty/Never/Throw
- From
- Interval
- Just
- Range
- Repeat
- Start
- Timer
- 變換操作
- Buffer
- FlatMap
- GroupBy
- Map
- Scan
- Window
- 過濾操作
- Debounce
- Distinct
- ElementAt
- Filter
- First
- IgnoreElements
- Last
- Sample
- Skip
- SkipLast
- Take
- TakeLast
- 結合操作
- And/Then/When
- CombineLatest
- Join
- Merge
- StartWith
- Switch
- Zip
- 錯誤處理
- Catch
- Retry
- 輔助操作
- Delay
- Do
- Materialize/Dematerialize
- ObserveOn
- Serialize
- Subscribe
- SubscribeOn
- TimeInterval
- Timeout
- Timestamp
- Using
- To
- 條件和布爾操作
- All/Contains/Amb
- DefaultIfEmpty
- SequenceEqual
- SkipUntil/SkipWhile
- TakeUntil/TakeWhile
- 算術和聚合操作
- Average/Concat/Reduce
- Max/Min/Count/Sum
- 異步操作
- 連接操作
- Connect
- Publish
- RefCount
- Replay
- 轉換操作
- 阻塞操作
- 字符串操作
- 按字母順序的操作符列表
- RxJava文檔和教程
- RxJava入門指南
- RxJava使用示例
- 實現自定義操作符
- 自定義插件
- Backpressure
- 錯誤處理
- Android模塊
- 參與開發
- 補充閱讀材料