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