只發(fā)射第一項(或者滿足某個條件的第一項)數(shù)據(jù)
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/first.c.png" alt="first" />
如果你只對Observable發(fā)射的第一項數(shù)據(jù),或者滿足某個條件的第一項數(shù)據(jù)感興趣,你可以使用First
操作符。
在某些實現(xiàn)中,First
沒有實現(xiàn)為一個返回Observable的過濾操作符,而是實現(xiàn)為一個在當(dāng)時就發(fā)射原始Observable指定數(shù)據(jù)項的阻塞函數(shù)。在這些實現(xiàn)中,如果你想要的是一個過濾操作符,最好使用Take(1)
或者ElementAt(0)
。
在一些實現(xiàn)中還有一個Single
操作符。它的行為與First
類似,但為了確保只發(fā)射單個值,它會等待原始Observable終止(否則,不是發(fā)射那個值,而是以一個錯誤通知終止)。你可以使用它從原始Observable獲取第一項數(shù)據(jù),而且也確保只發(fā)射一項數(shù)據(jù)。
在RxJava中,這個操作符被實現(xiàn)為first
,firstOrDefault
和takeFirst
。
可能容易混淆,BlockingObservable
也有名叫first
和firstOrDefault
的操作符,它們會阻塞并返回值,不是立即返回一個Observable。
還有幾個其它的操作符執(zhí)行類似的功能。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/first.png" alt="first" />
只發(fā)射第一個數(shù)據(jù),使用沒有參數(shù)的first
操作符。
示例代碼
Observable.just(1, 2, 3)
.first()
.subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer item) {
System.out.println("Next: " + item);
}
@Override
public void onError(Throwable error) {
System.err.println("Error: " + error.getMessage());
}
@Override
public void onCompleted() {
System.out.println("Sequence complete.");
}
});
輸出
Next: 1
Sequence complete.
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/firstN.png" alt="first" />
傳遞一個謂詞函數(shù)給first
,然后發(fā)射這個函數(shù)判定為true
的第一項數(shù)據(jù)。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/firstOrDefault.png" alt="firstOrDefault" />
firstOrDefault
與first
類似,但是在Observagle沒有發(fā)射任何數(shù)據(jù)時發(fā)射一個你在參數(shù)中指定的默認(rèn)值。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/firstOrDefaultN.png" alt="firstOrDefault" />
傳遞一個謂詞函數(shù)給firstOrDefault
,然后發(fā)射這個函數(shù)判定為true
的第一項數(shù)據(jù),如果沒有數(shù)據(jù)通過了謂詞測試就發(fā)射一個默認(rèn)值。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/first.takeFirst.png" alt="takeFirst" />
takeFirst
與first
類似,除了這一點:如果原始Observable沒有發(fā)射任何滿足條件的數(shù)據(jù),first
會拋出一個NoSuchElementException
,takeFist
會返回一個空的Observable(不調(diào)用onNext()
但是會調(diào)用onCompleted
)。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/single.png" alt="single" />
single
操作符也與first
類似,但是如果原始Observable在完成之前不是正好發(fā)射一次數(shù)據(jù),它會拋出一個NoSuchElementException
。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/single.p.png" alt="single" />
single
的變體接受一個謂詞函數(shù),發(fā)射滿足條件的單個值,如果不是正好只有一個數(shù)據(jù)項滿足條件,會以錯誤通知終止。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/singleOrDefault.png" alt="single" />
和firstOrDefault
類似,但是如果原始Observable發(fā)射超過一個的數(shù)據(jù),會以錯誤通知終止。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/singleOrDefault.p.png" alt="single" />
和firstOrDefault(T, Func1)
類似,如果沒有數(shù)據(jù)滿足條件,返回默認(rèn)值;如果有多個數(shù)據(jù)滿足條件,以錯誤通知終止。
first系列的這幾個操作符默認(rèn)不在任何特定的調(diào)度器上執(zhí)行。