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