Distinct
抑制(過濾掉)重復(fù)的數(shù)據(jù)項(xiàng)
Distinct
的過濾規(guī)則是:只允許還沒有發(fā)射過的數(shù)據(jù)項(xiàng)通過呛讲。
在某些實(shí)現(xiàn)中笔喉,有一些變體允許你調(diào)整判定兩個(gè)數(shù)據(jù)不同(distinct
)的標(biāo)準(zhǔn)。還有一些實(shí)現(xiàn)只比較一項(xiàng)數(shù)據(jù)和它的直接前驅(qū),因此只會(huì)從序列中過濾掉連續(xù)重復(fù)的數(shù)據(jù)。
distinct()
RxJava將這個(gè)操作符實(shí)現(xiàn)為distinct
函數(shù)。
示例代碼
Observable.just(1, 2, 1, 1, 2, 3)
.distinct()
.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
Next: 2
Next: 3
Sequence complete.
- Javadoc: distinct()
distinct(Func1)
這個(gè)操作符有一個(gè)變體接受一個(gè)函數(shù)皂甘。這個(gè)函數(shù)根據(jù)原始Observable發(fā)射的數(shù)據(jù)項(xiàng)產(chǎn)生一個(gè)Key,然后悼凑,比較這些Key而不是數(shù)據(jù)本身偿枕,來判定兩個(gè)數(shù)據(jù)是否是不同的。
- Javadoc: distinct(Func1)
distinctUntilChanged
RxJava還是實(shí)現(xiàn)了一個(gè)distinctUntilChanged
操作符佛析。它只判定一個(gè)數(shù)據(jù)和它的直接前驅(qū)是否是不同的益老。
distinctUntilChanged(Func1)
和distinct(Func1)
一樣,根據(jù)一個(gè)函數(shù)產(chǎn)生的Key判定兩個(gè)相鄰的數(shù)據(jù)項(xiàng)是不是不同的寸莫。
- Javadoc: distinctUntilChanged(Func1)
distinct
和distinctUntilChanged
默認(rèn)不在任何特定的調(diào)度器上執(zhí)行捺萌。
ElementAt
只發(fā)射第N項(xiàng)數(shù)據(jù)
ElementAt
操作符獲取原始Observable發(fā)射的數(shù)據(jù)序列指定索引位置的數(shù)據(jù)項(xiàng),然后當(dāng)做自己的唯一數(shù)據(jù)發(fā)射膘茎。
RxJava將這個(gè)操作符實(shí)現(xiàn)為elementAt
桃纯,給它傳遞一個(gè)基于0的索引值,它會(huì)發(fā)射原始Observable數(shù)據(jù)序列對(duì)應(yīng)索引位置的值披坏,如果你傳遞給elementAt
的值為5态坦,那么它會(huì)發(fā)射第六項(xiàng)的數(shù)據(jù)。
如果你傳遞的是一個(gè)負(fù)數(shù)棒拂,或者原始Observable的數(shù)據(jù)項(xiàng)數(shù)小于index+1
伞梯,將會(huì)拋出一個(gè)IndexOutOfBoundsException
異常。
- Javadoc: elementAt(int)
elementAtOrDefault
RxJava還實(shí)現(xiàn)了elementAtOrDefault
操作符帚屉。與elementAt
的區(qū)別是谜诫,如果索引值大于數(shù)據(jù)項(xiàng)數(shù),它會(huì)發(fā)射一個(gè)默認(rèn)值(通過額外的參數(shù)指定)攻旦,而不是拋出異常喻旷。但是如果你傳遞一個(gè)負(fù)數(shù)索引值,它仍然會(huì)拋出一個(gè)IndexOutOfBoundsException
異常牢屋。
- Javadoc: elementAtOrDefault(int,T)
elementAt
和elementAtOrDefault
默認(rèn)不在任何特定的調(diào)度器上執(zhí)行且预。
Filter
只發(fā)射通過了謂詞測(cè)試的數(shù)據(jù)項(xiàng)
Filter
操作符使用你指定的一個(gè)謂詞函數(shù)測(cè)試數(shù)據(jù)項(xiàng)槽袄,只有通過測(cè)試的數(shù)據(jù)才會(huì)被發(fā)射。
RxJava將這個(gè)操作符實(shí)現(xiàn)為filter
函數(shù)锋谐。
示例代碼
Observable.just(1, 2, 3, 4, 5)
.filter(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer item) {
return( item < 4 );
}
}).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
Next: 2
Next: 3
Sequence complete.
filter
默認(rèn)不在任何特定的調(diào)度器上執(zhí)行遍尺。
- Javadoc: filter(Func1)
ofType
ofType
是filter
操作符的一個(gè)特殊形式。它過濾一個(gè)Observable只返回指定類型的數(shù)據(jù)怀估。
ofType
默認(rèn)不在任何特定的調(diào)度器上指定狮鸭。
- Javadoc: ofType(Class)
First
只發(fā)射第一項(xiàng)(或者滿足某個(gè)條件的第一項(xiàng))數(shù)據(jù)
如果你只對(duì)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è)值,它會(huì)等待原始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
的操作符节芥,它們會(huì)阻塞并返回值在刺,不是立即返回一個(gè)Observable。
還有幾個(gè)其它的操作符執(zhí)行類似的功能头镊。
IgnoreElements
不發(fā)射任何數(shù)據(jù)蚣驼,只發(fā)射Observable的終止通知
IgnoreElements
操作符抑制原始Observable發(fā)射的所有數(shù)據(jù),只允許它的終止通知(onError
或onCompleted
)通過拧晕。
如果你不關(guān)心一個(gè)Observable發(fā)射的數(shù)據(jù)隙姿,但是希望在它完成時(shí)或遇到錯(cuò)誤終止時(shí)收到通知,你可以對(duì)Observable使用ignoreElements
操作符厂捞,它會(huì)確保永遠(yuǎn)不會(huì)調(diào)用觀察者的onNext()
方法输玷。
RxJava將這個(gè)操作符實(shí)現(xiàn)為ignoreElements
队丝。
- Javadoc: ignoreElements()
ignoreElements
默認(rèn)不在任何特定的調(diào)度器上執(zhí)行。
Last
只發(fā)射最后一項(xiàng)(或者滿足某個(gè)條件的最后一項(xiàng))數(shù)據(jù)
如果你只對(duì)Observable發(fā)射的最后一項(xiàng)數(shù)據(jù)欲鹏,或者滿足某個(gè)條件的最后一項(xiàng)數(shù)據(jù)感興趣机久,你可以使用Last
操作符。
在某些實(shí)現(xiàn)中赔嚎,Last
沒有實(shí)現(xiàn)為一個(gè)返回Observable的過濾操作符膘盖,而是實(shí)現(xiàn)為一個(gè)在當(dāng)時(shí)就發(fā)射原始Observable指定數(shù)據(jù)項(xiàng)的阻塞函數(shù)。在這些實(shí)現(xiàn)中尤误,如果你想要的是一個(gè)過濾操作符侠畔,最好使用TakeLast(1)
。
在RxJava中的實(shí)現(xiàn)是last
和lastOrDefault
损晤。
可能容易混淆软棺,BlockingObservable
也有名叫last
和lastOrDefault
的操作符,它們會(huì)阻塞并返回值尤勋,不是立即返回一個(gè)Observable喘落。
過濾操作符
只發(fā)射最后一項(xiàng)數(shù)據(jù),使用沒有參數(shù)的last
操作符最冰。
示例代碼
Observable.just(1, 2, 3)
.last()
.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: 3
Sequence complete.
- Javadoc: last()
這個(gè)版本的last
也是接受一個(gè)謂詞函數(shù)瘦棋,返回一個(gè)發(fā)射原始Observable中滿足條件的最后一項(xiàng)數(shù)據(jù)的Observable。
- Javadoc: last(Func1)
lastOrDefault
與last
類似暖哨,不同的是赌朋,如果原始Observable沒有發(fā)射任何值,它發(fā)射你指定的默認(rèn)值鹿蜀。
- Javadoc: lastOrDefault(T)
這個(gè)版本的lastOrDefault
可以接受一個(gè)謂詞函數(shù)箕慧,如果有數(shù)據(jù)滿足條件,返回的Observable就發(fā)射原始Observable滿足條件的最后一項(xiàng)數(shù)據(jù)茴恰,否則發(fā)射默認(rèn)值颠焦。
- Javadoc: lastOrDefault(T)
last
和lastOrDefault
默認(rèn)不在任何特定的調(diào)度器上執(zhí)行。
Sample
定期發(fā)射Observable最近發(fā)射的數(shù)據(jù)項(xiàng)
Sample
操作符定時(shí)查看一個(gè)Observable往枣,然后發(fā)射自上次采樣以來它最近發(fā)射的數(shù)據(jù)伐庭。
在某些實(shí)現(xiàn)中,有一個(gè)ThrottleFirst
操作符的功能類似分冈,但不是發(fā)射采樣期間的最近的數(shù)據(jù)圾另,而是發(fā)射在那段時(shí)間內(nèi)的第一項(xiàng)數(shù)據(jù)。
RxJava將這個(gè)操作符實(shí)現(xiàn)為sample
和throttleLast
雕沉。
注意:如果自上次采樣以來集乔,原始Observable沒有發(fā)射任何數(shù)據(jù),這個(gè)操作返回的Observable在那段時(shí)間內(nèi)也不會(huì)發(fā)射任何數(shù)據(jù)坡椒。
sample
(別名throttleLast
)的一個(gè)變體按照你參數(shù)中指定的時(shí)間間隔定時(shí)采樣(TimeUnit
指定時(shí)間單位)扰路。
sample
的這個(gè)變體默認(rèn)在computation
調(diào)度器上執(zhí)行尤溜,但是你可以使用第三個(gè)參數(shù)指定其它的調(diào)度器。
- Javadoc: sample(long,TimeUnit)和throttleLast(long,TimeUnit)
- Javadoc: sample(long,TimeUnit,Scheduler)和throttleLast(long,TimeUnit,Scheduler)
sample
的這個(gè)變體每當(dāng)?shù)诙€(gè)Observable發(fā)射一個(gè)數(shù)據(jù)(或者當(dāng)它終止)時(shí)就對(duì)原始Observable進(jìn)行采樣汗唱。第二個(gè)Observable通過參數(shù)傳遞給sample
宫莱。
sample
的這個(gè)變體默認(rèn)不在任何特定的調(diào)度器上執(zhí)行。
- Javadoc: sample(Observable)
throttleFirst
與throttleLast/sample
不同哩罪,在每個(gè)采樣周期內(nèi)授霸,它總是發(fā)射原始Observable的第一項(xiàng)數(shù)據(jù),而不是最近的一項(xiàng)际插。
throttleFirst
操作符默認(rèn)在computation
調(diào)度器上執(zhí)行碘耳,但是你可以使用第三個(gè)參數(shù)指定其它的調(diào)度器。
- Javadoc: throttleFirst(long,TimeUnit)
- Javadoc: throttleFirst(long,TimeUnit,Scheduler)
Skip
抑制Observable發(fā)射的前N項(xiàng)數(shù)據(jù)
使用Skip
操作符腹鹉,你可以忽略O(shè)bservable'發(fā)射的前N項(xiàng)數(shù)據(jù)藏畅,只保留之后的數(shù)據(jù)敷硅。
RxJava中這個(gè)操作符叫skip
功咒。skip
的這個(gè)變體默認(rèn)不在任何特定的調(diào)度器上執(zhí)行。
- Javadoc: skip(int)
skip
的這個(gè)變體接受一個(gè)時(shí)長(zhǎng)而不是數(shù)量參數(shù)绞蹦。它會(huì)丟棄原始Observable開始的那段時(shí)間發(fā)射的數(shù)據(jù)力奋,時(shí)長(zhǎng)和時(shí)間單位通過參數(shù)指定。
skip
的這個(gè)變體默認(rèn)在computation
調(diào)度器上執(zhí)行幽七,但是你可以使用第三個(gè)參數(shù)指定其它的調(diào)度器景殷。
- Javadoc: skip(long,TimeUnit)
- Javadoc: skip(long,TimeUnit,Scheduler)
SkipLast
抑制Observable發(fā)射的后N項(xiàng)數(shù)據(jù)
使用SkipLast
操作符修改原始Observable,你可以忽略O(shè)bservable'發(fā)射的后N項(xiàng)數(shù)據(jù)澡屡,只保留前面的數(shù)據(jù)猿挚。
[圖片上傳失敗...(image-b2ec0-1572187529963)]
使用SkipLast
操作符,你可以忽略原始Observable發(fā)射的后N項(xiàng)數(shù)據(jù)驶鹉,只保留之前的數(shù)據(jù)绩蜻。注意:這個(gè)機(jī)制是這樣實(shí)現(xiàn)的:延遲原始Observable發(fā)射的任何數(shù)據(jù)項(xiàng),直到它發(fā)射了N項(xiàng)數(shù)據(jù)室埋。
skipLast
的這個(gè)變體默認(rèn)不在任何特定的調(diào)度器上執(zhí)行办绝。
- Javadoc: skipLast(int)
還有一個(gè)skipLast
變體接受一個(gè)時(shí)長(zhǎng)而不是數(shù)量參數(shù)。它會(huì)丟棄在原始Observable的生命周期內(nèi)最后一段時(shí)間內(nèi)發(fā)射的數(shù)據(jù)姚淆。時(shí)長(zhǎng)和時(shí)間單位通過參數(shù)指定孕蝉。
注意:這個(gè)機(jī)制是這樣實(shí)現(xiàn)的:延遲原始Observable發(fā)射的任何數(shù)據(jù)項(xiàng),直到自這次發(fā)射之后過了給定的時(shí)長(zhǎng)腌逢。
skipLast
的這個(gè)變體默認(rèn)在computation
調(diào)度器上執(zhí)行降淮,但是你可以使用第三個(gè)參數(shù)指定其它的調(diào)度器。
- Javadoc: skipLast(long,TimeUnit)
- Javadoc: skipLast(long,TimeUnit,Scheduler)
Take
只發(fā)射前面的N項(xiàng)數(shù)據(jù)
使用Take
操作符讓你可以修改Observable的行為搏讶,只返回前面的N項(xiàng)數(shù)據(jù)佳鳖,然后發(fā)射完成通知纳本,忽略剩余的數(shù)據(jù)。
RxJava將這個(gè)操作符實(shí)現(xiàn)為take
函數(shù)腋颠。
如果你對(duì)一個(gè)Observable使用take(n)
(或它的同義詞limit(n)
)操作符繁成,而那個(gè)Observable發(fā)射的數(shù)據(jù)少于N項(xiàng),那么take
操作生成的Observable不會(huì)拋異呈缑担或發(fā)射onError
通知巾腕,在完成前它只會(huì)發(fā)射相同的少量數(shù)據(jù)。
示例代碼
Observable.just(1, 2, 3, 4, 5, 6, 7, 8)
.take(4)
.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
Next: 2
Next: 3
Next: 4
Sequence complete.
take(int)
默認(rèn)不任何特定的調(diào)度器上執(zhí)行絮蒿。
- Javadoc: take(int)
take
的這個(gè)變體接受一個(gè)時(shí)長(zhǎng)而不是數(shù)量參數(shù)尊搬。它會(huì)丟發(fā)射Observable開始的那段時(shí)間發(fā)射的數(shù)據(jù),時(shí)長(zhǎng)和時(shí)間單位通過參數(shù)指定土涝。
take
的這個(gè)變體默認(rèn)在computation
調(diào)度器上執(zhí)行佛寿,但是你可以使用第三個(gè)參數(shù)指定其它的調(diào)度器。
- Javadoc: take(long,TimeUnit)
- Javadoc: take(long,TimeUnit,Scheduler)
TakeLast
發(fā)射Observable發(fā)射的最后N項(xiàng)數(shù)據(jù)
使用TakeLast
操作符修改原始Observable但壮,你可以只發(fā)射Observable'發(fā)射的后N項(xiàng)數(shù)據(jù)冀泻,忽略前面的數(shù)據(jù)。
taskLast.n
使用takeLast
操作符蜡饵,你可以只發(fā)射原始Observable發(fā)射的后N項(xiàng)數(shù)據(jù)弹渔,忽略之前的數(shù)據(jù)。注意:這會(huì)延遲原始Observable發(fā)射的任何數(shù)據(jù)項(xiàng)溯祸,直到它全部完成肢专。
takeLast
的這個(gè)變體默認(rèn)不在任何特定的調(diào)度器上執(zhí)行。
- Javadoc: takeLast(int)
takeLast.t
還有一個(gè)takeLast
變體接受一個(gè)時(shí)長(zhǎng)而不是數(shù)量參數(shù)焦辅。它會(huì)發(fā)射在原始Observable的生命周期內(nèi)最后一段時(shí)間內(nèi)發(fā)射的數(shù)據(jù)博杖。時(shí)長(zhǎng)和時(shí)間單位通過參數(shù)指定。
注意:這會(huì)延遲原始Observable發(fā)射的任何數(shù)據(jù)項(xiàng)筷登,直到它全部完成剃根。
takeLast
的這個(gè)變體默認(rèn)在computation
調(diào)度器上執(zhí)行,但是你可以使用第三個(gè)參數(shù)指定其它的調(diào)度器仆抵。
takeLastBuffer
還有一個(gè)操作符叫takeLastBuffer
跟继,它和takeLast
類似,镣丑,唯一的不同是它把所有的數(shù)據(jù)項(xiàng)收集到一個(gè)List
再發(fā)射舔糖,而不是依次發(fā)射一個(gè)。
- Javadoc: takeLastBuffer(int)
- Javadoc: takeLastBuffer(long,TimeUnit)
- Javadoc: takeLastBuffer(long,TimeUnit,Scheduler)
- Javadoc: takeLastBuffer(int,long,TimeUnit)
- Javadoc: takeLastBuffer(int,long,TimeUnit,Scheduler)
結(jié)合操作
這個(gè)頁面展示的操作符可用于組合多個(gè)Observables莺匠。
- startWith(?) — 在數(shù)據(jù)序列的開頭增加一項(xiàng)數(shù)據(jù)
- merge(?) — 將多個(gè)Observable合并為一個(gè)
- mergeDelayError(?) — 合并多個(gè)Observables金吗,讓沒有錯(cuò)誤的Observable都完成后再發(fā)射錯(cuò)誤通知
- zip(?) — 使用一個(gè)函數(shù)組合多個(gè)Observable發(fā)射的數(shù)據(jù)集合,然后再發(fā)射這個(gè)結(jié)果
-
and(?), then(?), and when(?) — (
rxjava-joins
) 通過模式和計(jì)劃組合多個(gè)Observables發(fā)射的數(shù)據(jù)集合 - combineLatest(?) — 當(dāng)兩個(gè)Observables中的任何一個(gè)發(fā)射了一個(gè)數(shù)據(jù)時(shí),通過一個(gè)指定的函數(shù)組合每個(gè)Observable發(fā)射的最新數(shù)據(jù)(一共兩個(gè)數(shù)據(jù))摇庙,然后發(fā)射這個(gè)函數(shù)的結(jié)果
- join(?) and groupJoin(?) — 無論何時(shí)旱物,如果一個(gè)Observable發(fā)射了一個(gè)數(shù)據(jù)項(xiàng),只要在另一個(gè)Observable發(fā)射的數(shù)據(jù)項(xiàng)定義的時(shí)間窗口內(nèi)卫袒,就將兩個(gè)Observable發(fā)射的數(shù)據(jù)合并發(fā)射
- switchOnNext(?) — 將一個(gè)發(fā)射Observables的Observable轉(zhuǎn)換成另一個(gè)Observable宵呛,后者發(fā)射這些Observables最近發(fā)射的數(shù)據(jù)
(
rxjava-joins
) — 表示這個(gè)操作符當(dāng)前是可選的rxjava-joins
包的一部分,還沒有包含在標(biāo)準(zhǔn)的RxJava操作符集合里
And/Then/When
使用Pattern和Plan作為中介夕凝,將兩個(gè)或多個(gè)Observable發(fā)射的數(shù)據(jù)集合并到一起
And/Then/When操作符組合的行為類似于zip
宝穗,但是它們使用一個(gè)中間數(shù)據(jù)結(jié)構(gòu)。接受兩個(gè)或多個(gè)Observable码秉,一次一個(gè)將它們的發(fā)射物合并到Pattern
對(duì)象逮矛,然后操作那個(gè)Pattern
對(duì)象,變換為一個(gè)Plan
转砖。隨后將這些Plan
變換為Observable的發(fā)射物须鼎。
它們屬于rxjava-joins
模塊,不是核心RxJava包的一部分
CombineLatest
當(dāng)兩個(gè)Observables中的任何一個(gè)發(fā)射了數(shù)據(jù)時(shí)府蔗,使用一個(gè)函數(shù)結(jié)合每個(gè)Observable發(fā)射的最近數(shù)據(jù)項(xiàng)晋控,并且基于這個(gè)函數(shù)的結(jié)果發(fā)射數(shù)據(jù)。
CombineLatest
操作符行為類似于zip
礁竞,但是只有當(dāng)原始的Observable中的每一個(gè)都發(fā)射了一條數(shù)據(jù)時(shí)zip
才發(fā)射數(shù)據(jù)糖荒。CombineLatest
則在原始的Observable中任意一個(gè)發(fā)射了數(shù)據(jù)時(shí)發(fā)射一條數(shù)據(jù)。當(dāng)原始Observables的任何一個(gè)發(fā)射了一條數(shù)據(jù)時(shí)模捂,CombineLatest
使用一個(gè)函數(shù)結(jié)合它們最近發(fā)射的數(shù)據(jù),然后發(fā)射這個(gè)函數(shù)的返回值蜘矢。
RxJava將這個(gè)操作符實(shí)現(xiàn)為combineLatest
狂男,它接受二到九個(gè)Observable作為參數(shù),或者單個(gè)Observables列表作為參數(shù)品腹。它默認(rèn)不在任何特定的調(diào)度器上執(zhí)行岖食。
- Javadoc: combineLatest(List,FuncN)
- Javadoc: combineLatest(Observable,Observable,Func2)
withLatestFrom
withLatestFrom
操作符還在開發(fā)中,不是1.0版本的一部分舞吭。類似于combineLatest
泡垃,但是只在單個(gè)原始Observable發(fā)射了一條數(shù)據(jù)時(shí)才發(fā)射數(shù)據(jù)。
Join
任何時(shí)候羡鸥,只要在另一個(gè)Observable發(fā)射的數(shù)據(jù)定義的時(shí)間窗口內(nèi)蔑穴,這個(gè)Observable發(fā)射了一條數(shù)據(jù),就結(jié)合兩個(gè)Observable發(fā)射的數(shù)據(jù)惧浴。
Join
操作符結(jié)合兩個(gè)Observable發(fā)射的數(shù)據(jù)存和,基于時(shí)間窗口(你定義的針對(duì)每條數(shù)據(jù)特定的原則)選擇待集合的數(shù)據(jù)項(xiàng)。你將這些時(shí)間窗口實(shí)現(xiàn)為一些Observables,它們的生命周期從任何一條Observable發(fā)射的每一條數(shù)據(jù)開始捐腿。當(dāng)這個(gè)定義時(shí)間窗口的Observable發(fā)射了一條數(shù)據(jù)或者完成時(shí)纵朋,與這條數(shù)據(jù)關(guān)聯(lián)的窗口也會(huì)關(guān)閉。只要這條數(shù)據(jù)的窗口是打開的茄袖,它將繼續(xù)結(jié)合其它Observable發(fā)射的任何數(shù)據(jù)項(xiàng)操软。你定義一個(gè)用于結(jié)合數(shù)據(jù)的函數(shù)。
很多ReactiveX實(shí)現(xiàn)還有一個(gè)類似的GroupJoin
操作符。
Most ReactiveX implementations that have a Join operator also have a GroupJoin operator that is similar, except that the function you define to combine items emitted by the two Observables pairs individual items emitted by the source Observable not with an item from the second Observable, but with an Observable that emits items from the second Observable that fall in the same window.
The join
operator takes four parameters:
- the second Observable to combine with the source Observable
- a function that accepts an item from the source Observable and returns an Observable whose lifespan governs the duration during which that item will combine with items from the second Observable
- a function that accepts an item from the second Observable and returns an Observable whose lifespan governs the duration during which that item will combine with items from the first Observable
- a function that accepts an item from the first Observable and an item from the second Observable and returns an item to be emitted by the Observable returned from join
join
默認(rèn)不在任何特定的調(diào)度器上執(zhí)行。
- Javadoc: Join(Observable,Func1,Func1,Func2)
[圖片上傳失敗...(image-2198cc-1572187529963)]
The groupJoin
operator takes four parameters:
- the second Observable to combine with the source Observable
- a function that accepts an item from the source Observable and returns an Observable whose lifespan governs the duration during which that item will combine with items from the second Observable
- a function that accepts an item from the second Observable and returns an Observable whose lifespan governs the duration during which that item will combine with items from the first Observable
- a function that accepts an item from the first Observable and an Observable that emits items from the second Observable and returns an item to be emitted by the Observable returned from groupJoin
groupJoin
默認(rèn)不在任何特定的調(diào)度器上執(zhí)行蕴茴。
可選的StringObservable
類中也有一個(gè)join
操作符喂链。它將一個(gè)發(fā)射字符串序列的Observable轉(zhuǎn)換為一個(gè)發(fā)射單個(gè)字符串的Observable,join
操作符使用指定的定界符將全部單獨(dú)的字符串連接起來甥啄。
Merge
合并多個(gè)Observables的發(fā)射物
使用Merge
操作符你可以將多個(gè)Observables的輸出合并,就好像它們是一個(gè)單個(gè)的Observable一樣。
Merge
可能會(huì)讓合并的Observables發(fā)射的數(shù)據(jù)交錯(cuò)(有一個(gè)類似的操作符Concat
不會(huì)讓數(shù)據(jù)交錯(cuò)笆载,它會(huì)按順序一個(gè)接著一個(gè)發(fā)射多個(gè)Observables的發(fā)射物)。
正如圖例上展示的涯呻,任何一個(gè)原始Observable的onError
通知會(huì)被立即傳遞給觀察者凉驻,而且會(huì)終止合并后的Observable。
在很多ReactiveX實(shí)現(xiàn)中還有一個(gè)叫MergeDelayError
的操作符复罐,它的行為有一點(diǎn)不同涝登,它會(huì)保留onError
通知直到合并后的Observable所有的數(shù)據(jù)發(fā)射完成,在那時(shí)它才會(huì)把onError
傳遞給觀察者效诅。
RxJava將它實(shí)現(xiàn)為merge
, mergeWith
和mergeDelayError
胀滚。
示例代碼
Observable<Integer> odds = Observable.just(1, 3, 5).subscribeOn(someScheduler);
Observable<Integer> evens = Observable.just(2, 4, 6);
Observable.merge(odds, evens)
.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
Next: 3
Next: 5
Next: 2
Next: 4
Next: 6
Sequence complete.
- Javadoc: merge(Iterable)
- Javadoc: merge(Iterable,int)
- Javadoc: [merge(Observable])
- Javadoc: merge(Observable,Observable) (接受二到九個(gè)Observable)
除了傳遞多個(gè)Observable給merge
,你還可以傳遞一個(gè)Observable列表List
乱投,數(shù)組咽笼,甚至是一個(gè)發(fā)射Observable序列的Observable,merge
將合并它們的輸出作為單個(gè)Observable的輸出:
如果你傳遞一個(gè)發(fā)射Observables序列的Observable戚炫,你可以指定merge
應(yīng)該同時(shí)訂閱的Observable'的最大數(shù)量剑刑。一旦達(dá)到訂閱數(shù)的限制,它將不再訂閱原始Observable發(fā)射的任何其它Observable双肤,直到某個(gè)已經(jīng)訂閱的Observable發(fā)射了onCompleted
通知施掏。
- Javadoc: merge(Observable)
- Javadoc: merge(Observable,int)
merge
是靜態(tài)方法,mergeWith
是對(duì)象方法茅糜,舉個(gè)例子七芭,Observable.merge(odds,evens)
等價(jià)于odds.mergeWith(evens)
。
如果傳遞給merge
的任何一個(gè)的Observable發(fā)射了onError
通知終止了限匣,merge
操作符生成的Observable也會(huì)立即以onError
通知終止抖苦。如果你想讓它繼續(xù)發(fā)射數(shù)據(jù)毁菱,在最后才報(bào)告錯(cuò)誤,可以使用mergeDelayError
锌历。
mergeDelayError
behaves much like merge
. The exception is when one of the Observables being merged terminates with an onError notification. If this happens with merge, the merged Observable will immediately issue an onError
notification and terminate. mergeDelayError
, on the other hand, will hold off on reporting the error until it has given any other non-error-producing Observables that it is merging a chance to finish emitting their items, and it will emit those itself, and will only terminate with an onError
notification when all of the other merged Observables have finished.
Because it is possible that more than one of the merged Observables encountered an error, mergeDelayError
may pass information about multiple errors in the onError notification (it will never invoke the observer’s onError
method more than once). For this reason, if you want to know the nature of these errors, you should write your observers’ onError methods so that they accept a parameter of the class CompositeException
.
mergeDelayError
has fewer variants. You cannot pass it an Iterable or Array of Observables, but you can pass it an Observable that emits Observables or between one and nine individual Observables as parameters. There is not an instance method version of mergeDelayError
as there is for merge
.
- Javadoc: mergeDelayError(Observable)
- Javadoc: mergeDelayError(Observable,Observable)
StartWith
在數(shù)據(jù)序列的開頭插入一條指定的項(xiàng)
如果你想要一個(gè)Observable在發(fā)射數(shù)據(jù)之前先發(fā)射一個(gè)指定的數(shù)據(jù)序列贮庞,可以使用StartWith
操作符。(如果你想一個(gè)Observable發(fā)射的數(shù)據(jù)末尾追加一個(gè)數(shù)據(jù)序列可以使用Concat
操作符究西。)
可接受一個(gè)Iterable或者多個(gè)Observable作為函數(shù)的參數(shù)窗慎。
- Javadoc: startWith(Iterable)
- Javadoc: startWith(T) (最多接受九個(gè)參數(shù))
你也可以傳遞一個(gè)Observable給startWith
,它會(huì)將那個(gè)Observable的發(fā)射物插在原始Observable發(fā)射的數(shù)據(jù)序列之前卤材,然后把這個(gè)當(dāng)做自己的發(fā)射物集合遮斥。這可以看作是Concat
的反轉(zhuǎn)。
- Javadoc: startWith(Observable)
Switch
將一個(gè)發(fā)射多個(gè)Observables的Observable轉(zhuǎn)換成另一個(gè)單獨(dú)的Observable扇丛,后者發(fā)射那些Observables最近發(fā)射的數(shù)據(jù)項(xiàng)
Switch
訂閱一個(gè)發(fā)射多個(gè)Observables的Observable术吗。它每次觀察那些Observables中的一個(gè),Switch
返回的這個(gè)Observable取消訂閱前一個(gè)發(fā)射數(shù)據(jù)的Observable帆精,開始發(fā)射最近的Observable發(fā)射的數(shù)據(jù)较屿。注意:當(dāng)原始Observable發(fā)射了一個(gè)新的Observable時(shí)(不是這個(gè)新的Observable發(fā)射了一條數(shù)據(jù)時(shí)),它將取消訂閱之前的那個(gè)Observable卓练。這意味著隘蝎,在后來那個(gè)Observable產(chǎn)生之后到它開始發(fā)射數(shù)據(jù)之前的這段時(shí)間里,前一個(gè)Observable發(fā)射的數(shù)據(jù)將被丟棄(就像圖例上的那個(gè)黃色圓圈一樣)襟企。
Java將這個(gè)操作符實(shí)現(xiàn)為switchOnNext
嘱么。它默認(rèn)不在任何特定的調(diào)度器上執(zhí)行。
- Javadoc: switchOnNext(Observable)
Zip
通過一個(gè)函數(shù)將多個(gè)Observables的發(fā)射物結(jié)合到一起顽悼,基于這個(gè)函數(shù)的結(jié)果為每個(gè)結(jié)合體發(fā)射單個(gè)數(shù)據(jù)項(xiàng)曼振。
Zip
操作符返回一個(gè)Obversable,它使用這個(gè)函數(shù)按順序結(jié)合兩個(gè)或多個(gè)Observables發(fā)射的數(shù)據(jù)項(xiàng)表蝙,然后它發(fā)射這個(gè)函數(shù)返回的結(jié)果拴测。它按照嚴(yán)格的順序應(yīng)用這個(gè)函數(shù)。它只發(fā)射與發(fā)射數(shù)據(jù)項(xiàng)最少的那個(gè)Observable一樣多的數(shù)據(jù)府蛇。
RxJava將這個(gè)操作符實(shí)現(xiàn)為zip
和zipWith
。
zip
的最后一個(gè)參數(shù)接受每個(gè)Observable發(fā)射的一項(xiàng)數(shù)據(jù)屿愚,返回被壓縮后的數(shù)據(jù)汇跨,它可以接受一到九個(gè)參數(shù):一個(gè)Observable序列,或者一些發(fā)射Observable的Observables妆距。
- Javadoc: zip(Iterable,FuncN)
- Javadoc: zip(Observable,FuncN)
- Javadoc: zip(Observable,Observable,Func2) (最多可以有九個(gè)Observables參數(shù))
zipWith
zipWith
操作符總是接受兩個(gè)參數(shù)穷遂,第一個(gè)參數(shù)是一個(gè)Observable或者一個(gè)Iterable。
- Javadoc: zipWith(Observable,Func2)
- Javadoc: zipWith(Iterable,Func2)
zip
和zipWith
默認(rèn)不在任何特定的操作符上執(zhí)行娱据。
錯(cuò)誤處理
很多操作符可用于對(duì)Observable發(fā)射的onError
通知做出響應(yīng)或者從錯(cuò)誤中恢復(fù)蚪黑,例如,你可以:
- 吞掉這個(gè)錯(cuò)誤,切換到一個(gè)備用的Observable繼續(xù)發(fā)射數(shù)據(jù)
- 吞掉這個(gè)錯(cuò)誤然后發(fā)射默認(rèn)值
- 吞掉這個(gè)錯(cuò)誤并立即嘗試重啟這個(gè)Observable
- 吞掉這個(gè)錯(cuò)誤忌穿,在一些回退間隔后重啟這個(gè)Observable
這是操作符列表:
- onErrorResumeNext(?) — 指示Observable在遇到錯(cuò)誤時(shí)發(fā)射一個(gè)數(shù)據(jù)序列
- onErrorReturn(?) — 指示Observable在遇到錯(cuò)誤時(shí)發(fā)射一個(gè)特定的數(shù)據(jù)
- onExceptionResumeNext(?) — instructs an Observable to continue emitting items after it encounters an exception (but not another variety of throwable)指示Observable遇到錯(cuò)誤時(shí)繼續(xù)發(fā)射數(shù)據(jù)
- retry(?) — 指示Observable遇到錯(cuò)誤時(shí)重試
- retryWhen(?) — 指示Observable遇到錯(cuò)誤時(shí)抒寂,將錯(cuò)誤傳遞給另一個(gè)Observable來決定是否要重新給訂閱這個(gè)Observable
Catch
從onError
通知中恢復(fù)發(fā)射數(shù)據(jù)
Catch
操作符攔截原始Observable的onError
通知,將它替換為其它的數(shù)據(jù)項(xiàng)或數(shù)據(jù)序列掠剑,讓產(chǎn)生的Observable能夠正常終止或者根本不終止屈芜。
在某些ReactiveX的實(shí)現(xiàn)中,有一個(gè)叫onErrorResumeNext
的操作符朴译,它的行為與Catch
相似井佑。
RxJava將Catch
實(shí)現(xiàn)為三個(gè)不同的操作符:
onErrorReturn
讓Observable遇到錯(cuò)誤時(shí)發(fā)射一個(gè)特殊的項(xiàng)并且正常終止。
onErrorResumeNext
讓Observable在遇到錯(cuò)誤時(shí)開始發(fā)射第二個(gè)Observable的數(shù)據(jù)序列眠寿。
onExceptionResumeNext
讓Observable在遇到錯(cuò)誤時(shí)繼續(xù)發(fā)射后面的數(shù)據(jù)項(xiàng)躬翁。
onErrorReturn
onErrorReturn
方法返回一個(gè)鏡像原有Observable行為的新Observable,后者會(huì)忽略前者的onError
調(diào)用盯拱,不會(huì)將錯(cuò)誤傳遞給觀察者盒发,作為替代,它會(huì)發(fā)發(fā)射一個(gè)特殊的項(xiàng)并調(diào)用觀察者的onCompleted
方法坟乾。
- Javadoc: onErrorReturn(Func1)
onErrorResumeNext
onErrorResumeNext
方法返回一個(gè)鏡像原有Observable行為的新Observable迹辐,后者會(huì)忽略前者的onError
調(diào)用,不會(huì)將錯(cuò)誤傳遞給觀察者甚侣,作為替代明吩,它會(huì)開始鏡像另一個(gè),備用的Observable殷费。
- Javadoc: onErrorResumeNext(Func1)
- Javadoc: onErrorResumeNext(Observable)
onExceptionResumeNext
和onErrorResumeNext
類似印荔,onExceptionResumeNext
方法返回一個(gè)鏡像原有Observable行為的新Observable,也使用一個(gè)備用的Observable详羡,不同的是仍律,如果onError
收到的Throwable
不是一個(gè)Exception
,它會(huì)將錯(cuò)誤傳遞給觀察者的onError
方法实柠,不會(huì)使用備用的Observable水泉。
- Javadoc: onExceptionResumeNext(Observable)
Retry
如果原始Observable遇到錯(cuò)誤,重新訂閱它期望它能正常終止
Retry
操作符不會(huì)將原始Observable的onError
通知傳遞給觀察者窒盐,它會(huì)訂閱這個(gè)Observable草则,再給它一次機(jī)會(huì)無錯(cuò)誤地完成它的數(shù)據(jù)序列。Retry
總是傳遞onNext
通知給觀察者蟹漓,由于重新訂閱炕横,可能會(huì)造成數(shù)據(jù)項(xiàng)重復(fù),如上圖所示葡粒。
RxJava中的實(shí)現(xiàn)為retry
和retryWhen
份殿。
無論收到多少次onError
通知膜钓,無參數(shù)版本的retry
都會(huì)繼續(xù)訂閱并發(fā)射原始Observable。
接受單個(gè)count
參數(shù)的retry
會(huì)最多重新訂閱指定的次數(shù)卿嘲,如果次數(shù)超了颂斜,它不會(huì)嘗試再次訂閱,它會(huì)把最新的一個(gè)onError
通知傳遞給它的觀察者腔寡。
還有一個(gè)版本的retry
接受一個(gè)謂詞函數(shù)作為參數(shù)焚鲜,這個(gè)函數(shù)的兩個(gè)參數(shù)是:重試次數(shù)和導(dǎo)致發(fā)射onError
通知的Throwable
。這個(gè)函數(shù)返回一個(gè)布爾值放前,如果返回true
忿磅,retry
應(yīng)該再次訂閱和鏡像原始的Observable,如果返回false
凭语,retry
會(huì)將最新的一個(gè)onError
通知傳遞給它的觀察者葱她。
retry
操作符默認(rèn)在trampoline
調(diào)度器上執(zhí)行。
- Javadoc: retry()
- Javadoc: retry(long)
- Javadoc: retry(Func2)
retryWhen
retryWhen
和retry
類似似扔,區(qū)別是吨些,retryWhen
將onError
中的Throwable
傳遞給一個(gè)函數(shù),這個(gè)函數(shù)產(chǎn)生另一個(gè)Observable炒辉,retryWhen
觀察它的結(jié)果再?zèng)Q定是不是要重新訂閱原始的Observable豪墅。如果這個(gè)Observable發(fā)射了一項(xiàng)數(shù)據(jù),它就重新訂閱黔寇,如果這個(gè)Observable發(fā)射的是onError
通知偶器,它就將這個(gè)通知傳遞給觀察者然后終止。
retryWhen
默認(rèn)在trampoline
調(diào)度器上執(zhí)行缝裤,你可以通過參數(shù)指定其它的調(diào)度器屏轰。
示例代碼
Observable.create((Subscriber<? super String> s) -> {
System.out.println("subscribing");
s.onError(new RuntimeException("always fails"));
}).retryWhen(attempts -> {
return attempts.zipWith(Observable.range(1, 3), (n, i) -> i).flatMap(i -> {
System.out.println("delay retry by " + i + " second(s)");
return Observable.timer(i, TimeUnit.SECONDS);
});
}).toBlocking().forEach(System.out::println);
輸出
subscribing
delay retry by 1 second(s)
subscribing
delay retry by 2 second(s)
subscribing
delay retry by 3 second(s)
subscribing
- Javadoc: retryWhen(Func1)
- Javadoc: retryWhen(Func1,Scheduler)
輔助操作
這個(gè)頁面列出了很多用于Observable的輔助操作符
- materialize(?) — 將Observable轉(zhuǎn)換成一個(gè)通知列表convert an Observable into a list of Notifications
- dematerialize(?) — 將上面的結(jié)果逆轉(zhuǎn)回一個(gè)Observable
- timestamp(?) — 給Observable發(fā)射的每個(gè)數(shù)據(jù)項(xiàng)添加一個(gè)時(shí)間戳
- serialize(?) — 強(qiáng)制Observable按次序發(fā)射數(shù)據(jù)并且要求功能是完好的
- cache(?) — 記住Observable發(fā)射的數(shù)據(jù)序列并發(fā)射相同的數(shù)據(jù)序列給后續(xù)的訂閱者
- observeOn(?) — 指定觀察者觀察Observable的調(diào)度器
- subscribeOn(?) — 指定Observable執(zhí)行任務(wù)的調(diào)度器
- doOnEach(?) — 注冊(cè)一個(gè)動(dòng)作,對(duì)Observable發(fā)射的每個(gè)數(shù)據(jù)項(xiàng)使用
- doOnCompleted(?) — 注冊(cè)一個(gè)動(dòng)作憋飞,對(duì)正常完成的Observable使用
- doOnError(?) — 注冊(cè)一個(gè)動(dòng)作霎苗,對(duì)發(fā)生錯(cuò)誤的Observable使用
- doOnTerminate(?) — 注冊(cè)一個(gè)動(dòng)作,對(duì)完成的Observable使用榛做,無論是否發(fā)生錯(cuò)誤
- doOnSubscribe(?) — 注冊(cè)一個(gè)動(dòng)作唁盏,在觀察者訂閱時(shí)使用
- doOnUnsubscribe(?) — 注冊(cè)一個(gè)動(dòng)作,在觀察者取消訂閱時(shí)使用
- finallyDo(?) — 注冊(cè)一個(gè)動(dòng)作检眯,在Observable完成時(shí)使用
- delay(?) — 延時(shí)發(fā)射Observable的結(jié)果
- delaySubscription(?) — 延時(shí)處理訂閱請(qǐng)求
- timeInterval(?) — 定期發(fā)射數(shù)據(jù)
- using(?) — 創(chuàng)建一個(gè)只在Observable生命周期存在的資源
- single(?) — 強(qiáng)制返回單個(gè)數(shù)據(jù)升敲,否則拋出異常
- singleOrDefault(?) — 如果Observable完成時(shí)返回了單個(gè)數(shù)據(jù),就返回它轰传,否則返回默認(rèn)數(shù)據(jù)
- toFuture(?), toIterable(?), toList(?) — 將Observable轉(zhuǎn)換為其它對(duì)象或數(shù)據(jù)結(jié)構(gòu)
Delay
延遲一段指定的時(shí)間再發(fā)射來自O(shè)bservable的發(fā)射物
Delay
操作符讓原始Observable在發(fā)射每項(xiàng)數(shù)據(jù)之前都暫停一段指定的時(shí)間段。效果是Observable發(fā)射的數(shù)據(jù)項(xiàng)在時(shí)間上向前整體平移了一個(gè)增量瘪撇。
RxJava的實(shí)現(xiàn)是 delay
和delaySubscription
获茬。
第一種delay
接受一個(gè)定義時(shí)長(zhǎng)的參數(shù)(包括數(shù)量和單位)港庄。每當(dāng)原始Observable發(fā)射一項(xiàng)數(shù)據(jù),delay
就啟動(dòng)一個(gè)定時(shí)器恕曲,當(dāng)定時(shí)器過了給定的時(shí)間段時(shí)鹏氧,delay
返回的Observable發(fā)射相同的數(shù)據(jù)項(xiàng)。
注意:delay
不會(huì)平移onError
通知佩谣,它會(huì)立即將這個(gè)通知傳遞給訂閱者把还,同時(shí)丟棄任何待發(fā)射的onNext
通知。然而它會(huì)平移一個(gè)onCompleted
通知茸俭。
delay
默認(rèn)在computation
調(diào)度器上執(zhí)行吊履,你可以通過參數(shù)指定使用其它的調(diào)度器。
- Javadoc: delay(long,TimeUnit)
- Javadoc: delay()
另一種delay
不實(shí)用常數(shù)延時(shí)參數(shù)调鬓,它使用一個(gè)函數(shù)針對(duì)原始Observable的每一項(xiàng)數(shù)據(jù)返回一個(gè)Observable艇炎,它監(jiān)視返回的這個(gè)Observable,當(dāng)任何那樣的Observable終止時(shí)腾窝,delay
返回的Observable就發(fā)射關(guān)聯(lián)的那項(xiàng)數(shù)據(jù)缀踪。
這種delay
默認(rèn)不在任何特定的調(diào)度器上執(zhí)行。
- Javadoc: delay(Func1)
這個(gè)版本的delay
對(duì)每一項(xiàng)數(shù)據(jù)使用一個(gè)Observable作為原始Observable的延時(shí)定時(shí)器虹脯。
這種delay
默認(rèn)不在任何特定的調(diào)度器上執(zhí)行驴娃。
- Javadoc: delay(Func0,Func1)
還有一個(gè)操作符delaySubscription
讓你你可以延遲訂閱原始Observable。它結(jié)合搜一個(gè)定義延時(shí)的參數(shù)循集。
delaySubscription
默認(rèn)在computation
調(diào)度器上執(zhí)行唇敞,你可以通過參數(shù)指定使用其它的調(diào)度器。
- Javadoc: delaySubscription(long,TimeUnit)
- Javadoc: delaySubscription(long,TimeUnit,Scheduler)
還有一個(gè)版本的delaySubscription
使用一個(gè)Obseable而不是一個(gè)固定的時(shí)長(zhǎng)來設(shè)置訂閱延時(shí)暇榴。
這種delaySubscription
默認(rèn)不在任何特定的調(diào)度器上執(zhí)行厚棵。
- Javadoc: delaySubscription(Func0)
Do
注冊(cè)一個(gè)動(dòng)作作為原始Observable生命周期事件的一種占位符
你可以注冊(cè)回調(diào),當(dāng)Observable的某個(gè)事件發(fā)生時(shí)蔼紧,Rx會(huì)在與Observable鏈關(guān)聯(lián)的正常通知集合中調(diào)用它婆硬。Rx實(shí)現(xiàn)了多種操作符用于達(dá)到這個(gè)目的。
RxJava實(shí)現(xiàn)了很多Do
操作符的變體奸例。
doOnEach
doOnEach
操作符讓你可以注冊(cè)一個(gè)回調(diào)彬犯,它產(chǎn)生的Observable每發(fā)射一項(xiàng)數(shù)據(jù)就會(huì)調(diào)用它一次。你可以以Action
的形式傳遞參數(shù)給它查吊,這個(gè)Action接受一個(gè)onNext
的變體Notification
作為它的唯一參數(shù)谐区,你也可以傳遞一個(gè)Observable給doOnEach
,這個(gè)Observable的onNext
會(huì)被調(diào)用逻卖,就好像它訂閱了原始的Observable一樣宋列。
- Javadoc: doOnEach(Action1)
- Javadoc: doOnEach(Observer)
doOnNext
doOnNext
操作符類似于doOnEach(Action1)
,但是它的Action不是接受一個(gè)Notification
參數(shù)评也,而是接受發(fā)射的數(shù)據(jù)項(xiàng)炼杖。
示例代碼
Observable.just(1, 2, 3)
.doOnNext(new Action1<Integer>() {
@Override
public void call(Integer item) {
if( item > 1 ) {
throw new RuntimeException( "Item exceeds maximum value" );
}
}
}).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
Error: Item exceeds maximum value
doOnSubscribe
doOnSubscribe
操作符注冊(cè)一個(gè)動(dòng)作灭返,當(dāng)觀察者訂閱它生成的Observable它就會(huì)被調(diào)用。
- Javadoc: doOnSubscribe(Action0)
doOnUnsubscribe
doOnUnsubscribe
操作符注冊(cè)一個(gè)動(dòng)作坤邪,當(dāng)觀察者取消訂閱它生成的Observable它就會(huì)被調(diào)用熙含。
- Javadoc: doOnUnsubscribe(Action0)
doOnCompleted
doOnCompleted
操作符注冊(cè)一個(gè)動(dòng)作,當(dāng)它產(chǎn)生的Observable正常終止調(diào)用onCompleted
時(shí)會(huì)被調(diào)用艇纺。
- Javadoc: doOnCompleted(Action0)
doOnError
doOnError
操作符注冊(cè)一個(gè)動(dòng)作怎静,當(dāng)它產(chǎn)生的Observable異常終止調(diào)用onError
時(shí)會(huì)被調(diào)用。
- Javadoc: doOnError(Action0)
doOnTerminate
doOnTerminate
操作符注冊(cè)一個(gè)動(dòng)作黔衡,當(dāng)它產(chǎn)生的Observable終止之前會(huì)被調(diào)用蚓聘,無論是正常還是異常終止。
- Javadoc: doOnTerminate(Action0)
finallyDo
finallyDo
操作符注冊(cè)一個(gè)動(dòng)作员帮,當(dāng)它產(chǎn)生的Observable終止之后會(huì)被調(diào)用或粮,無論是正常還是異常終止。
- Javadoc: finallyDo(Action0)
Materialize/Dematerialize
Materialize
將數(shù)據(jù)項(xiàng)和事件通知都當(dāng)做數(shù)據(jù)項(xiàng)發(fā)射捞高,Dematerialize
剛好相反氯材。
一個(gè)合法的有限的Obversable將調(diào)用它的觀察者的onNext
方法零次或多次,然后調(diào)用觀察者的onCompleted
或onError
正好一次硝岗。Materialize
操作符將這一系列調(diào)用氢哮,包括原來的onNext
通知和終止通知onCompleted
或onError
都轉(zhuǎn)換為一個(gè)Observable發(fā)射的數(shù)據(jù)序列。
RxJava的materialize
將來自原始Observable的通知轉(zhuǎn)換為Notification
對(duì)象型檀,然后它返回的Observable會(huì)發(fā)射這些數(shù)據(jù)冗尤。
materialize
默認(rèn)不在任何特定的調(diào)度器 (Scheduler
) 上執(zhí)行脓钾。
- Javadoc: materialize()
Dematerialize
操作符是Materialize
的逆向過程类嗤,它將Materialize
轉(zhuǎn)換的結(jié)果還原成它原本的形式。
dematerialize
反轉(zhuǎn)這個(gè)過程家破,將原始Observable發(fā)射的Notification
對(duì)象還原成Observable的通知仓坞。
dematerialize
默認(rèn)不在任何特定的調(diào)度器 (Scheduler
) 上執(zhí)行背零。
- Javadoc: dematerialize()
ObserveOn
指定一個(gè)觀察者在哪個(gè)調(diào)度器上觀察這個(gè)Observable
很多ReactiveX實(shí)現(xiàn)都使用調(diào)度器 "Scheduler
"來管理多線程環(huán)境中Observable的轉(zhuǎn)場(chǎng)。你可以使用ObserveOn
操作符指定Observable在一個(gè)特定的調(diào)度器上發(fā)送通知給觀察者 (調(diào)用觀察者的onNext
, onCompleted
, onError
方法)无埃。
注意:當(dāng)遇到一個(gè)異常時(shí)ObserveOn
會(huì)立即向前傳遞這個(gè)onError
終止通知徙瓶,它不會(huì)等待慢速消費(fèi)的Observable接受任何之前它已經(jīng)收到但還沒有發(fā)射的數(shù)據(jù)項(xiàng)。這可能意味著onError
通知會(huì)跳到(并吞掉)原始Observable發(fā)射的數(shù)據(jù)項(xiàng)前面嫉称,正如圖例上展示的侦镇。
SubscribeOn
操作符的作用類似,但它是用于指定Observable本身在特定的調(diào)度器上執(zhí)行织阅,它同樣會(huì)在那個(gè)調(diào)度器上給觀察者發(fā)通知壳繁。
RxJava中,要指定Observable應(yīng)該在哪個(gè)調(diào)度器上調(diào)用觀察者的onNext
, onCompleted
, onError
方法,你需要使用observeOn
操作符氮趋,傳遞給它一個(gè)合適的Scheduler
伍派。
- Javadoc: observeOn(Scheduler)
Serialize
強(qiáng)制一個(gè)Observable連續(xù)調(diào)用并保證行為正確
一個(gè)Observable可以異步調(diào)用它的觀察者的方法,可能是從不同的線程調(diào)用剩胁。這可能會(huì)讓Observable行為不正確,它可能會(huì)在某一個(gè)onNext
調(diào)用之前嘗試調(diào)用onCompleted
或onError
方法祥国,或者從兩個(gè)不同的線程同時(shí)調(diào)用onNext
方法昵观。使用Serialize
操作符,你可以糾正這個(gè)Observable的行為舌稀,保證它的行為是正確的且是同步的啊犬。
RxJava中的實(shí)現(xiàn)是serialize
,它默認(rèn)不在任何特定的調(diào)度器上執(zhí)行壁查。
- Javadoc: serialize()
Subscribe
操作來自O(shè)bservable的發(fā)射物和通知
Subscribe
操作符是連接觀察者和Observable的膠水觉至。一個(gè)觀察者要想看到Observable發(fā)射的數(shù)據(jù)項(xiàng),或者想要從Observable獲取錯(cuò)誤和完成通知睡腿,它首先必須使用這個(gè)操作符訂閱那個(gè)Observable语御。
Subscribe
操作符的一般實(shí)現(xiàn)可能會(huì)接受一到三個(gè)方法(然后由觀察者組合它們),或者接受一個(gè)實(shí)現(xiàn)了包含這三個(gè)方法的接口的對(duì)象(有時(shí)叫做Observer
或Subscriber
):
onNext
每當(dāng)Observable發(fā)射了一項(xiàng)數(shù)據(jù)它就會(huì)調(diào)用這個(gè)方法席怪。這個(gè)方法的參數(shù)是這個(gè)Observable發(fā)射的數(shù)據(jù)項(xiàng)应闯。
onError
Observable調(diào)用這個(gè)方法表示它無法生成期待的數(shù)據(jù)或者遇到了其它錯(cuò)誤。這將停止Observable挂捻,它在這之后不會(huì)再調(diào)用onNext
或onCompleted
碉纺。onError
方法的參數(shù)是導(dǎo)致這個(gè)錯(cuò)誤的原因的一個(gè)表示(有時(shí)可能是一個(gè)Exception或Throwable對(duì)象,其它時(shí)候也可能是一個(gè)簡(jiǎn)單的字符串刻撒,取決于具體的實(shí)現(xiàn))骨田。
onCompleted
如果沒有遇到任何錯(cuò)誤,Observable在最后一次調(diào)用onCompleted
之后會(huì)調(diào)用這個(gè)方法声怔。
如果一個(gè)Observable直到有一個(gè)觀察者訂閱它才開始發(fā)射數(shù)據(jù)項(xiàng)态贤,就稱之為"冷"的Observable;如果一個(gè)Observable可能在任何時(shí)刻開始發(fā)射數(shù)據(jù)捧搞,就稱之為"熱"的Observable抵卫,一個(gè)訂閱者可能從開始之后的某個(gè)時(shí)刻開始觀察它發(fā)射的數(shù)據(jù)序列,它可能會(huì)錯(cuò)過在訂閱之前發(fā)射的數(shù)據(jù)胎撇。
RxJava中的實(shí)現(xiàn)是subscribe
方法介粘。
如果你使用無參數(shù)的版本,它將觸發(fā)對(duì)Observable的一個(gè)訂閱晚树,但是將忽略它的發(fā)射物和通知姻采。這個(gè)操作會(huì)激活一個(gè)"冷"的Observable。
你也可以傳遞一到三個(gè)函數(shù)給它爵憎,它們會(huì)按下面的方法解釋:
onNext
-
onNext
和onError
-
onNext
,onError
和onCompleted
最后慨亲,你還可以傳遞一個(gè)Observer
或Subscriber
接口給它婚瓜,Observer
接口包含這三個(gè)以on
開頭的方法。Subscriber
接口也實(shí)現(xiàn)了這三個(gè)方法刑棵,而且還添加了幾個(gè)額外的方法巴刻,用于支持使用反壓操作(reactive pull backpressure
),這讓Subscriber
可以在Observable完成前取消訂閱蛉签。
subscribe
方法返回一個(gè)實(shí)現(xiàn)了Subscription
接口的對(duì)象胡陪。這個(gè)接口包含unsubscribe
方法,任何時(shí)刻你都可以調(diào)用它來斷開subscribe
方法建立的Observable和觀察者之間的訂閱關(guān)系碍舍。
- Javadoc: subscribe()
- Javadoc: subscribe(Action1)
- Javadoc: subscribe(Action1,Action1)
- Javadoc: subscribe(Action1,Action1,Action0)
- Javadoc: subscribe(Observer)
- Javadoc: subscribe(Subscriber)
foreach
forEach
方法是簡(jiǎn)化版的subscribe
柠座,你同樣可以傳遞一到三個(gè)函數(shù)給它,解釋和傳遞給subscribe
時(shí)一樣片橡。
不同的是妈经,你無法使用forEach
返回的對(duì)象取消訂閱。也沒辦法傳遞一個(gè)可以用于取消訂閱的參數(shù)捧书。因此吹泡,只有當(dāng)你明確地需要操作Observable的所有發(fā)射物和通知時(shí),你才應(yīng)該使用這個(gè)操作符鳄厌。
- Javadoc: forEach(Action1)
- Javadoc: forEach(Action1,Action1)
- Javadoc: forEach(Action1,Action1,A/Users/mcxiaoke/github/RxDocs/docs/BlockingObservable.mdction0)
BlockingObservable
BlockingObservable
類中也有一個(gè)類似的叫作forEach
的方法荞胡。詳細(xì)的說明見 BlockingObservable
SubscribeOn
指定Observable自身在哪個(gè)調(diào)度器上執(zhí)行
很多ReactiveX實(shí)現(xiàn)都使用調(diào)度器 "Scheduler
"來管理多線程環(huán)境中Observable的轉(zhuǎn)場(chǎng)。你可以使用SubscribeOn
操作符指定Observable在一個(gè)特定的調(diào)度器上運(yùn)轉(zhuǎn)了嚎。
ObserveOn
操作符的作用類似泪漂,但是功能很有限,它指示Observable在一個(gè)指定的調(diào)度器上給觀察者發(fā)通知歪泳。
在某些實(shí)現(xiàn)中還有一個(gè)UnsubscribeOn
操作符萝勤。
- Javadoc: subscribeOn(Scheduler)
- Javadoc: unsubscribeOn(Scheduler)
TimeInterval
將一個(gè)發(fā)射數(shù)據(jù)的Observable轉(zhuǎn)換為發(fā)射那些數(shù)據(jù)發(fā)射時(shí)間間隔的Observable
TimeInterval
操作符攔截原始Observable發(fā)射的數(shù)據(jù)項(xiàng),替換為發(fā)射表示相鄰發(fā)射物時(shí)間間隔的對(duì)象呐伞。
RxJava中的實(shí)現(xiàn)為timeInterval
敌卓,這個(gè)操作符將原始Observable轉(zhuǎn)換為另一個(gè)Observable,后者發(fā)射一個(gè)標(biāo)志替換前者的數(shù)據(jù)項(xiàng)伶氢,這個(gè)標(biāo)志表示前者的兩個(gè)連續(xù)發(fā)射物之間流逝的時(shí)間長(zhǎng)度趟径。新的Observable的第一個(gè)發(fā)射物表示的是在觀察者訂閱原始Observable到原始Observable發(fā)射它的第一項(xiàng)數(shù)據(jù)之間流逝的時(shí)間長(zhǎng)度。不存在與原始Observable發(fā)射最后一項(xiàng)數(shù)據(jù)和發(fā)射onCompleted
通知之間時(shí)長(zhǎng)對(duì)應(yīng)的發(fā)射物癣防。
timeInterval
默認(rèn)在immediate
調(diào)度器上執(zhí)行蜗巧,你可以通過傳參數(shù)修改。
- Javadoc: timeInterval()
- Javadoc: timeInterval(Scheduler)
Timeout
對(duì)原始Observable的一個(gè)鏡像蕾盯,如果過了一個(gè)指定的時(shí)長(zhǎng)仍沒有發(fā)射數(shù)據(jù)幕屹,它會(huì)發(fā)一個(gè)錯(cuò)誤通知
如果原始Observable過了指定的一段時(shí)長(zhǎng)沒有發(fā)射任何數(shù)據(jù),Timeout
操作符會(huì)以一個(gè)onError
通知終止這個(gè)Observable。
RxJava中的實(shí)現(xiàn)為timeout
望拖,但是有好幾個(gè)變體渺尘。
第一個(gè)變體接受一個(gè)時(shí)長(zhǎng)參數(shù),每當(dāng)原始Observable發(fā)射了一項(xiàng)數(shù)據(jù)说敏,timeout
就啟動(dòng)一個(gè)計(jì)時(shí)器鸥跟,如果計(jì)時(shí)器超過了指定指定的時(shí)長(zhǎng)而原始Observable沒有發(fā)射另一項(xiàng)數(shù)據(jù),timeout
就拋出TimeoutException
像云,以一個(gè)錯(cuò)誤通知終止Observable锌雀。
這個(gè)timeout
默認(rèn)在computation
調(diào)度器上執(zhí)行,你可以通過參數(shù)指定其它的調(diào)度器迅诬。
- Javadoc: timeout(long,TimeUnit)
- Javadoc: timeout()
這個(gè)版本的timeout
在超時(shí)時(shí)會(huì)切換到使用一個(gè)你指定的備用的Observable,而不是發(fā)錯(cuò)誤通知婿牍。它也默認(rèn)在computation
調(diào)度器上執(zhí)行侈贷。
- Javadoc: timeout(long,TimeUnit,Observable)
- Javadoc: timeout(long,TimeUnit,Observable,Scheduler)
這個(gè)版本的timeout
使用一個(gè)函數(shù)針對(duì)原始Observable的每一項(xiàng)返回一個(gè)Observable,如果當(dāng)這個(gè)Observable終止時(shí)原始Observable還沒有發(fā)射另一項(xiàng)數(shù)據(jù)等脂,就會(huì)認(rèn)為是超時(shí)了俏蛮,timeout
就拋出TimeoutException
,以一個(gè)錯(cuò)誤通知終止Observable上遥。
這個(gè)timeout
默認(rèn)在immediate
調(diào)度器上執(zhí)行搏屑。
- Javadoc: timeout(Func1)
這個(gè)版本的timeout
同時(shí)指定超時(shí)時(shí)長(zhǎng)和備用的Observable。它默認(rèn)在immediate
調(diào)度器上執(zhí)行粉楚。
- Javadoc: timeout(Func1,Observable)
這個(gè)版本的time
除了給每一項(xiàng)設(shè)置超時(shí)辣恋,還可以單獨(dú)給第一項(xiàng)設(shè)置一個(gè)超時(shí)。它默認(rèn)在immediate
調(diào)度器上執(zhí)行模软。
- Javadoc: timeout(Func0,Func1)
同上伟骨,但是同時(shí)可以指定一個(gè)備用的Observable。它默認(rèn)在immediate
調(diào)度器上執(zhí)行燃异。
- Javadoc: timeout(Func0,Func1,Observable)
Timestamp
給Observable發(fā)射的數(shù)據(jù)項(xiàng)附加一個(gè)時(shí)間戳
RxJava中的實(shí)現(xiàn)為timestamp
携狭,它將一個(gè)發(fā)射T類型數(shù)據(jù)的Observable轉(zhuǎn)換為一個(gè)發(fā)射類型為Timestamped<T>
的數(shù)據(jù)的Observable,每一項(xiàng)都包含數(shù)據(jù)的原始發(fā)射時(shí)間回俐。
timestamp
默認(rèn)在immediate
調(diào)度器上執(zhí)行逛腿,但是可以通過參數(shù)指定其它的調(diào)度器。
- Javadoc: timestamp()
- Javadoc: timestamp(Scheduler)
Using
創(chuàng)建一個(gè)只在Observable生命周期內(nèi)存在的一次性資源
Using
操作符讓你可以指示Observable創(chuàng)建一個(gè)只在它的生命周期內(nèi)存在的資源仅颇,當(dāng)Observable終止時(shí)這個(gè)資源會(huì)被自動(dòng)釋放单默。
using
操作符接受三個(gè)參數(shù):
- 一個(gè)用戶創(chuàng)建一次性資源的工廠函數(shù)
- 一個(gè)用于創(chuàng)建Observable的工廠函數(shù)
- 一個(gè)用于釋放資源的函數(shù)
當(dāng)一個(gè)觀察者訂閱using
返回的Observable時(shí),using
將會(huì)使用Observable工廠函數(shù)創(chuàng)建觀察者要觀察的Observable灵莲,同時(shí)使用資源工廠函數(shù)創(chuàng)建一個(gè)你想要?jiǎng)?chuàng)建的資源雕凹。當(dāng)觀察者取消訂閱這個(gè)Observable時(shí),或者當(dāng)觀察者終止時(shí)(無論是正常終止還是因錯(cuò)誤而終止),using
使用第三個(gè)函數(shù)釋放它創(chuàng)建的資源枚抵。
using
默認(rèn)不在任何特定的調(diào)度器上執(zhí)行线欲。
- Javadoc: using(Func0,Func1,Action1)
To
將Observable轉(zhuǎn)換為另一個(gè)對(duì)象或數(shù)據(jù)結(jié)構(gòu)
ReactiveX的很多語言特定實(shí)現(xiàn)都有一種操作符讓你可以將Observable或者Observable發(fā)射的數(shù)據(jù)序列轉(zhuǎn)換為另一個(gè)對(duì)象或數(shù)據(jù)結(jié)構(gòu)。它們中的一些會(huì)阻塞直到Observable終止汽摹,然后生成一個(gè)等價(jià)的對(duì)象或數(shù)據(jù)結(jié)構(gòu)李丰;另一些返回一個(gè)發(fā)射那個(gè)對(duì)象或數(shù)據(jù)結(jié)構(gòu)的Observable。
在某些ReactiveX實(shí)現(xiàn)中逼泣,還有一個(gè)操作符用于將Observable轉(zhuǎn)換成阻塞式的趴泌。一個(gè)阻塞式的Ogbservable在普通的Observable的基礎(chǔ)上增加了幾個(gè)方法,用于操作Observable發(fā)射的數(shù)據(jù)項(xiàng)拉庶。
getIterator
getIterator
操作符只能用于BlockingObservable
的子類嗜憔,要使用它,你首先必須把原始的Observable轉(zhuǎn)換為一個(gè)BlockingObservable
氏仗〖罚可以使用這兩個(gè)操作符:BlockingObservable.from
或the Observable.toBlocking
。
這個(gè)操作符將Observable轉(zhuǎn)換為一個(gè)Iterator
皆尔,你可以通過它迭代原始Observable發(fā)射的數(shù)據(jù)集呐舔。
- Javadoc: BlockingObservable.getIterator()
toFuture
toFuture
操作符也是只能用于BlockingObservable
。這個(gè)操作符將Observable轉(zhuǎn)換為一個(gè)返回單個(gè)數(shù)據(jù)項(xiàng)的Future
慷蠕,如果原始Observable發(fā)射多個(gè)數(shù)據(jù)項(xiàng)珊拼,Future
會(huì)收到一個(gè)IllegalArgumentException
;如果原始Observable沒有發(fā)射任何數(shù)據(jù)流炕,Future
會(huì)收到一個(gè)NoSuchElementException
澎现。
如果你想將發(fā)射多個(gè)數(shù)據(jù)項(xiàng)的Observable轉(zhuǎn)換為Future
,可以這樣用:myObservable.toList().toBlocking().toFuture()
浪感。
- Javadoc: BlockingObservable.toFuture()
toIterable
toFuture
操作符也是只能用于BlockingObservable
昔头。這個(gè)操作符將Observable轉(zhuǎn)換為一個(gè)Iterable
,你可以通過它迭代原始Observable發(fā)射的數(shù)據(jù)集影兽。
- Javadoc: BlockingObservable.toIterable()
toList
通常揭斧,發(fā)射多項(xiàng)數(shù)據(jù)的Observable會(huì)為每一項(xiàng)數(shù)據(jù)調(diào)用onNext
方法。你可以用toList
操作符改變這個(gè)行為峻堰,讓Observable將多項(xiàng)數(shù)據(jù)組合成一個(gè)List
讹开,然后調(diào)用一次onNext
方法傳遞整個(gè)列表。
如果原始Observable沒有發(fā)射任何數(shù)據(jù)就調(diào)用了onCompleted
捐名,toList
返回的Observable會(huì)在調(diào)用onCompleted
之前發(fā)射一個(gè)空列表旦万。如果原始Observable調(diào)用了onError
,toList
返回的Observable會(huì)立即調(diào)用它的觀察者的onError
方法镶蹋。
toList
默認(rèn)不在任何特定的調(diào)度器上執(zhí)行成艘。
- Javadoc: toList()
toMap
toMap
收集原始Observable發(fā)射的所有數(shù)據(jù)項(xiàng)到一個(gè)Map(默認(rèn)是HashMap)然后發(fā)射這個(gè)Map赏半。你可以提供一個(gè)用于生成Map的Key的函數(shù),還可以提供一個(gè)函數(shù)轉(zhuǎn)換數(shù)據(jù)項(xiàng)到Map存儲(chǔ)的值(默認(rèn)數(shù)據(jù)項(xiàng)本身就是值)淆两。
toMap
默認(rèn)不在任何特定的調(diào)度器上執(zhí)行断箫。
- Javadoc: toMap(Func1)
- Javadoc: toMap(Func1,Func1)
- Javadoc: toMap(Func1,Func1,Func0)
toMultiMap
toMultiMap
類似于toMap
,不同的是秋冰,它生成的這個(gè)Map同時(shí)還是一個(gè)ArrayList
(默認(rèn)是這樣仲义,你可以傳遞一個(gè)可選的工廠方法修改這個(gè)行為)。
toMultiMap
默認(rèn)不在任何特定的調(diào)度器上執(zhí)行剑勾。
- Javadoc: toMultiMap(Func1)
- Javadoc: toMultiMap(Func1,Func1)
- Javadoc: toMultiMap(Func1,Func1,Func0)
- Javadoc: toMultiMap(Func1,Func1,Func0,Func1)
toSortedList
toSortedList
類似于toList
埃撵,不同的是,它會(huì)對(duì)產(chǎn)生的列表排序虽另,默認(rèn)是自然升序暂刘,如果發(fā)射的數(shù)據(jù)項(xiàng)沒有實(shí)現(xiàn)Comparable
接口,會(huì)拋出一個(gè)異常捂刺。然而鸳惯,你也可以傳遞一個(gè)函數(shù)作為用于比較兩個(gè)數(shù)據(jù)項(xiàng),這是toSortedList
不會(huì)使用Comparable
接口叠萍。
toSortedList
默認(rèn)不在任何特定的調(diào)度器上執(zhí)行。
- Javadoc: toSortedList()
- Javadoc: toSortedList(Func2)