這一節(jié)解釋 BlockingObservable 的子類. 一個(gè)阻塞的Observable 繼承普通的Observable類,增加了一些可用于阻塞Observable發(fā)射的數(shù)據(jù)的操作符。
要將普通的Observable 轉(zhuǎn)換為 BlockingObservable,可以使用 [Observable.toBlocking(?)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#toBlocking()) 方法或者BlockingObservable.from(?) 方法。
forEach(?) — 對(duì)Observable發(fā)射的每一項(xiàng)數(shù)據(jù)調(diào)用一個(gè)方法,會(huì)阻塞直到Observable完成first(?) — 阻塞直到Observable發(fā)射了一個(gè)數(shù)據(jù),然后返回第一項(xiàng)數(shù)據(jù)firstOrDefault(?) — 阻塞直到Observable發(fā)射了一個(gè)數(shù)據(jù)或者終止,返回第一項(xiàng)數(shù)據(jù),或者返回默認(rèn)值last(?) — 阻塞直到Observable終止,然后返回最后一項(xiàng)數(shù)據(jù)lastOrDefault(?) — 阻塞直到Observable終止,然后返回最后一項(xiàng)的數(shù)據(jù),或者返回默認(rèn)值mostRecent(?) — 返回一個(gè)總是返回Observable最近發(fā)射的數(shù)據(jù)的iterablenext(?) — 返回一個(gè)Iterable,會(huì)阻塞直到Observable發(fā)射了另一個(gè)值,然后返回那個(gè)值latest(?) — 返回一個(gè)iterable,會(huì)阻塞直到或者除非Observable發(fā)射了一個(gè)iterable沒有返回的值,然后返回這個(gè)值single(?) — 如果Observable終止時(shí)只發(fā)射了一個(gè)值,返回那個(gè)值,否則拋出異常singleOrDefault(?) — 如果Observable終止時(shí)只發(fā)射了一個(gè)值,返回那個(gè)值,否則否好默認(rèn)值toFuture(?) — 將Observable轉(zhuǎn)換為一個(gè)FuturetoIterable(?) — 將一個(gè)發(fā)射數(shù)據(jù)序列的Observable轉(zhuǎn)換為一個(gè)IterablegetIterator(?) — 將一個(gè)發(fā)射數(shù)據(jù)序列的Observable轉(zhuǎn)換為一個(gè)Iterator伴隨這個(gè)解釋還有一個(gè)修改版的彈珠圖,表示阻塞Observable的彈珠圖:
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/B.legend.png" alt="BlockingObservables" />
BlockingObservable的方法不是將一個(gè)Observable變換為另一個(gè),也不是過濾Observables,它們會(huì)打斷Observable的調(diào)用鏈,會(huì)阻塞等待直到Observable發(fā)射了想要的數(shù)據(jù),然后返回這個(gè)數(shù)據(jù)(而不是一個(gè)Observable)。
要將一個(gè)Observable轉(zhuǎn)換為一個(gè)BlockingObservable,你可以使用Observable.toBlocking或BlockingObservable.from方法。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/B.first.png" alt="first" />
要獲取BlockingObservable的發(fā)射物,使用無參數(shù)的first方法。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/B.first.p.png" alt="first" />
你也可以給first方法傳遞一個(gè)謂詞函數(shù)用于獲取滿足條件的BlockingObservable。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/B.firstOrDefault.png" alt="firstOrDefault" />
和過濾操作符一樣,如果原始Observable沒有數(shù)據(jù),first會(huì)拋出異常NoSuchElementException,firstOrDefault會(huì)返回一個(gè)默認(rèn)值。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/B.firstOrDefault.p.png" alt="firstOrDefault" />
firstOrDefault同樣也接受一個(gè)謂詞函數(shù)作為參數(shù),用于獲取滿足條件的第一項(xiàng),如果沒有滿足條件的就返回默認(rèn)值。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/B.single.png" alt="single" />
single和first類似,但是如果不是正好發(fā)射一個(gè)數(shù)據(jù),會(huì)拋出異常NoSuchElementException。其它幾個(gè)變體的功能也是類似的。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/B.single.p.png" alt="single" />
同上,接受一個(gè)謂詞函數(shù),如果滿足條件的不是正好一個(gè),會(huì)拋出異常。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/B.singleOrDefault.png" alt="single" />
類似firstOrDefault,在為空時(shí)返回默認(rèn)值,超過一個(gè)就拋出異常。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/B.singleOrDefault.p.png" alt="single" />
類似firstOrDefault,接受一個(gè)謂詞函數(shù),如果沒有復(fù)合條件的,返回默認(rèn)值;如果有多個(gè)復(fù)合條件的,以錯(cuò)誤通知終止。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/B.next.png" alt="next" />
next操作符會(huì)阻塞直到BlockingObservable返回另外一個(gè)值,然后它返回那個(gè)值。你可以重復(fù)調(diào)用這個(gè)方法從BlockingObservable獲取后續(xù)的數(shù)據(jù)項(xiàng)。以阻塞的方式高效的迭代獲取它的發(fā)射物。
latest操作符也是類似的,但是它不會(huì)阻塞等待下一個(gè)值,它立即返回最近發(fā)射的數(shù)據(jù)項(xiàng),只在Observable還沒有發(fā)射任何數(shù)據(jù)時(shí)會(huì)阻塞。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/B.mostRecent.png" alt="mostRecent" />
mostRecent操作符讓你可以用類似的方式迭代一個(gè)BlockingObservable,但是它總是立即返回一個(gè)值,或者是默認(rèn)值(如果BlockingObservable還沒有發(fā)射任何數(shù)據(jù)),或者是BlockingObservable最近發(fā)射的數(shù)據(jù)項(xiàng)。
BlockingObservable類中也有一個(gè)類似的叫作forEach的方法。要使用這個(gè)方法,你首先需要使用BlockingObservable.from方法或Observable.toBlocking操作符將原始Observable轉(zhuǎn)換為一個(gè)BlockingObservable。
BlockingObservable.forEach接受單個(gè)函數(shù)作為參數(shù),這個(gè)函數(shù)的作用類似于普通Observable訂閱中的onNext函數(shù)。forEach自身會(huì)阻塞知道BlockingObservable完成,當(dāng)它不阻塞時(shí)就是完成了,不是通過調(diào)用一個(gè)回調(diào)方法表示它完成了。如果遇到了錯(cuò)誤它將拋出一個(gè)RuntimeException(而不是調(diào)用一個(gè)類似于onError的回調(diào)方法)。
BlockingObservabletoBlocking()BlockingObservable.from()| 操作符 | 執(zhí)行結(jié)果 | Rx.NET等價(jià)操作 | ||
|---|---|---|---|---|
| 發(fā)射多個(gè)數(shù)據(jù)的Observable | 發(fā)射單個(gè)數(shù)據(jù)的Observable | 不發(fā)射數(shù)據(jù)的Observable | ||
Observable.first |
第一項(xiàng) | 單個(gè)數(shù)據(jù) | 該元素不存在 | firstAsync |
BlockingObservable.first |
第一項(xiàng) | 單個(gè)數(shù)據(jù) | 該元素不存在 | first |
Observable.firstOrDefault |
第一項(xiàng) | 單個(gè)數(shù)據(jù) | 默認(rèn)數(shù)據(jù) | firstOrDefaultAsync |
BlockingObservable.firstOrDefault |
第一項(xiàng) | 單個(gè)數(shù)據(jù) | 默認(rèn)數(shù)據(jù) | firstOrDefault |
Observable.last |
最后一項(xiàng) | 單個(gè)數(shù)據(jù) | 該元素不存在 | lastAsync |
BlockingObservable.last |
最后一項(xiàng) | 單個(gè)數(shù)據(jù) | 該元素不存在 | last |
Observable.lastOrDefault |
最后一項(xiàng) | 單個(gè)數(shù)據(jù) | 默認(rèn)數(shù)據(jù) | lastOrDefaultAsync |
BlockingObservable.lastOrDefault |
最后一項(xiàng) | 單個(gè)數(shù)據(jù) | 默認(rèn)數(shù)據(jù) | lastOrDefault |
Observable.single |
非法參數(shù) | 單個(gè)數(shù)據(jù) | 該元素不存在 | singleAsync |
BlockingObservable.single |
非法參數(shù) | 單個(gè)數(shù)據(jù) | 該元素不存在 | single |
Observable.singleOrDefault |
非法參數(shù) | 單個(gè)數(shù)據(jù) | 默認(rèn)數(shù)據(jù) | singleOrDefaultAsync |
BlockingObservable.singleOrDefault |
非法參數(shù) | 單個(gè)數(shù)據(jù) | 默認(rèn)數(shù)據(jù) | singleOrDefault |