Rxjava操作符四

Distinct

抑制(過濾掉)重復(fù)的數(shù)據(jù)項(xiàng)

distinct

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()

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.

distinct(Func1)

distinct

這個(gè)操作符有一個(gè)變體接受一個(gè)函數(shù)皂甘。這個(gè)函數(shù)根據(jù)原始Observable發(fā)射的數(shù)據(jù)項(xiàng)產(chǎn)生一個(gè)Key,然后悼凑,比較這些Key而不是數(shù)據(jù)本身偿枕,來判定兩個(gè)數(shù)據(jù)是否是不同的。

distinctUntilChanged

distinctUntilChanged

RxJava還是實(shí)現(xiàn)了一個(gè)distinctUntilChanged操作符佛析。它只判定一個(gè)數(shù)據(jù)和它的直接前驅(qū)是否是不同的益老。

distinctUntilChanged(Func1)

distinctUntilChanged.key

distinct(Func1)一樣,根據(jù)一個(gè)函數(shù)產(chǎn)生的Key判定兩個(gè)相鄰的數(shù)據(jù)項(xiàng)是不是不同的寸莫。

distinctdistinctUntilChanged默認(rèn)不在任何特定的調(diào)度器上執(zhí)行捺萌。

ElementAt

只發(fā)射第N項(xiàng)數(shù)據(jù)

elementAt

ElementAt操作符獲取原始Observable發(fā)射的數(shù)據(jù)序列指定索引位置的數(shù)據(jù)項(xiàng),然后當(dāng)做自己的唯一數(shù)據(jù)發(fā)射膘茎。

elementAt

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異常。

elementAtOrDefault

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異常牢屋。

elementAtelementAtOrDefault默認(rèn)不在任何特定的調(diào)度器上執(zhí)行且预。

Filter

只發(fā)射通過了謂詞測(cè)試的數(shù)據(jù)項(xiàng)

filter

Filter操作符使用你指定的一個(gè)謂詞函數(shù)測(cè)試數(shù)據(jù)項(xiàng)槽袄,只有通過測(cè)試的數(shù)據(jù)才會(huì)被發(fā)射。

filter

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í)行遍尺。

ofType

ofType

ofTypefilter操作符的一個(gè)特殊形式。它過濾一個(gè)Observable只返回指定類型的數(shù)據(jù)怀估。

ofType默認(rèn)不在任何特定的調(diào)度器上指定狮鸭。

First

只發(fā)射第一項(xiàng)(或者滿足某個(gè)條件的第一項(xiàng))數(shù)據(jù)

first

如果你只對(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铸豁,firstOrDefaulttakeFirst灌曙。

可能容易混淆,BlockingObservable也有名叫firstfirstOrDefault的操作符节芥,它們會(huì)阻塞并返回值在刺,不是立即返回一個(gè)Observable。

還有幾個(gè)其它的操作符執(zhí)行類似的功能头镊。

IgnoreElements

不發(fā)射任何數(shù)據(jù)蚣驼,只發(fā)射Observable的終止通知

ignoreElements

IgnoreElements操作符抑制原始Observable發(fā)射的所有數(shù)據(jù),只允許它的終止通知(onErroronCompleted)通過拧晕。

如果你不關(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队丝。

ignoreElements默認(rèn)不在任何特定的調(diào)度器上執(zhí)行。

Last

只發(fā)射最后一項(xiàng)(或者滿足某個(gè)條件的最后一項(xiàng))數(shù)據(jù)

last

如果你只對(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)是lastlastOrDefault损晤。

可能容易混淆软棺,BlockingObservable也有名叫lastlastOrDefault的操作符,它們會(huì)阻塞并返回值尤勋,不是立即返回一個(gè)Observable喘落。

過濾操作符

last

只發(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.
last

這個(gè)版本的last也是接受一個(gè)謂詞函數(shù)瘦棋,返回一個(gè)發(fā)射原始Observable中滿足條件的最后一項(xiàng)數(shù)據(jù)的Observable。

last

lastOrDefaultlast類似暖哨,不同的是赌朋,如果原始Observable沒有發(fā)射任何值,它發(fā)射你指定的默認(rèn)值鹿蜀。

last

這個(gè)版本的lastOrDefault可以接受一個(gè)謂詞函數(shù)箕慧,如果有數(shù)據(jù)滿足條件,返回的Observable就發(fā)射原始Observable滿足條件的最后一項(xiàng)數(shù)據(jù)茴恰,否則發(fā)射默認(rèn)值颠焦。

lastlastOrDefault默認(rèn)不在任何特定的調(diào)度器上執(zhí)行。

Sample

定期發(fā)射Observable最近發(fā)射的數(shù)據(jù)項(xiàng)

sample

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)為samplethrottleLast雕沉。

注意:如果自上次采樣以來集乔,原始Observable沒有發(fā)射任何數(shù)據(jù),這個(gè)操作返回的Observable在那段時(shí)間內(nèi)也不會(huì)發(fā)射任何數(shù)據(jù)坡椒。

sample

sample(別名throttleLast)的一個(gè)變體按照你參數(shù)中指定的時(shí)間間隔定時(shí)采樣(TimeUnit指定時(shí)間單位)扰路。

sample的這個(gè)變體默認(rèn)在computation調(diào)度器上執(zhí)行尤溜,但是你可以使用第三個(gè)參數(shù)指定其它的調(diào)度器。

sample

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í)行。

throttleFirst

throttleFirstthrottleLast/sample不同哩罪,在每個(gè)采樣周期內(nèi)授霸,它總是發(fā)射原始Observable的第一項(xiàng)數(shù)據(jù),而不是最近的一項(xiàng)际插。

throttleFirst操作符默認(rèn)在computation調(diào)度器上執(zhí)行碘耳,但是你可以使用第三個(gè)參數(shù)指定其它的調(diào)度器。

Skip

抑制Observable發(fā)射的前N項(xiàng)數(shù)據(jù)

skip

使用Skip操作符腹鹉,你可以忽略O(shè)bservable'發(fā)射的前N項(xiàng)數(shù)據(jù)藏畅,只保留之后的數(shù)據(jù)敷硅。

skip

RxJava中這個(gè)操作符叫skip功咒。skip的這個(gè)變體默認(rèn)不在任何特定的調(diào)度器上執(zhí)行。

skip

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)度器景殷。

SkipLast

抑制Observable發(fā)射的后N項(xiàng)數(shù)據(jù)

skipLast

使用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í)行办绝。

skipLast

還有一個(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)度器。

Take

只發(fā)射前面的N項(xiàng)數(shù)據(jù)

take

使用Take操作符讓你可以修改Observable的行為搏讶,只返回前面的N項(xiàng)數(shù)據(jù)佳鳖,然后發(fā)射完成通知纳本,忽略剩余的數(shù)據(jù)。

take

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í)行絮蒿。

take

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)度器。

TakeLast

發(fā)射Observable發(fā)射的最后N項(xiàng)數(shù)據(jù)

takeLast

使用TakeLast操作符修改原始Observable但壮,你可以只發(fā)射Observable'發(fā)射的后N項(xiàng)數(shù)據(jù)冀泻,忽略前面的數(shù)據(jù)。

taskLast.n

takeLast

使用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í)行。

takeLast.t

takeLast

還有一個(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

takeLast

還有一個(gè)操作符叫takeLastBuffer跟继,它和takeLast類似,镣丑,唯一的不同是它把所有的數(shù)據(jù)項(xiàng)收集到一個(gè)List再發(fā)射舔糖,而不是依次發(fā)射一個(gè)。

結(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

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ā)射物须鼎。

and/then/when

它們屬于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

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ù)的返回值蜘矢。

combineLatest

RxJava將這個(gè)操作符實(shí)現(xiàn)為combineLatest狂男,它接受二到九個(gè)Observable作為參數(shù),或者單個(gè)Observables列表作為參數(shù)品腹。它默認(rèn)不在任何特定的調(diào)度器上執(zhí)行岖食。

withLatestFrom

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

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ù)。

groupJoin

很多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.

join

The join operator takes four parameters:

  1. the second Observable to combine with the source Observable
  2. 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
  3. 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
  4. 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í)行。

[圖片上傳失敗...(image-2198cc-1572187529963)]

The groupJoin operator takes four parameters:

  1. the second Observable to combine with the source Observable
  2. 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
  3. 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
  4. 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í)行蕴茴。

st.join

可選的StringObservable類中也有一個(gè)join操作符喂链。它將一個(gè)發(fā)射字符串序列的Observable轉(zhuǎn)換為一個(gè)發(fā)射單個(gè)字符串的Observable,join操作符使用指定的定界符將全部單獨(dú)的字符串連接起來甥啄。

Merge

合并多個(gè)Observables的發(fā)射物

merge

使用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。

mergeDelayError

在很多ReactiveX實(shí)現(xiàn)中還有一個(gè)叫MergeDelayError的操作符复罐,它的行為有一點(diǎn)不同涝登,它會(huì)保留onError通知直到合并后的Observable所有的數(shù)據(jù)發(fā)射完成,在那時(shí)它才會(huì)把onError傳遞給觀察者效诅。

RxJava將它實(shí)現(xiàn)為merge, mergeWithmergeDelayError胀滚。

merge

示例代碼

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.

除了傳遞多個(gè)Observable給merge,你還可以傳遞一個(gè)Observable列表List乱投,數(shù)組咽笼,甚至是一個(gè)發(fā)射Observable序列的Observable,merge將合并它們的輸出作為單個(gè)Observable的輸出:

merge

如果你傳遞一個(gè)發(fā)射Observables序列的Observable戚炫,你可以指定merge應(yīng)該同時(shí)訂閱的Observable'的最大數(shù)量剑刑。一旦達(dá)到訂閱數(shù)的限制,它將不再訂閱原始Observable發(fā)射的任何其它Observable双肤,直到某個(gè)已經(jīng)訂閱的Observable發(fā)射了onCompleted通知施掏。

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锌历。

merge

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 onErrornotification 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.

StartWith

在數(shù)據(jù)序列的開頭插入一條指定的項(xiàng)

startWith

如果你想要一個(gè)Observable在發(fā)射數(shù)據(jù)之前先發(fā)射一個(gè)指定的數(shù)據(jù)序列贮庞,可以使用StartWith操作符。(如果你想一個(gè)Observable發(fā)射的數(shù)據(jù)末尾追加一個(gè)數(shù)據(jù)序列可以使用Concat操作符究西。)

startWith

可接受一個(gè)Iterable或者多個(gè)Observable作為函數(shù)的參數(shù)窗慎。

startWith

你也可以傳遞一個(gè)Observable給startWith,它會(huì)將那個(gè)Observable的發(fā)射物插在原始Observable發(fā)射的數(shù)據(jù)序列之前卤材,然后把這個(gè)當(dāng)做自己的發(fā)射物集合遮斥。這可以看作是Concat的反轉(zhuǎn)。

Switch

將一個(gè)發(fā)射多個(gè)Observables的Observable轉(zhuǎn)換成另一個(gè)單獨(dú)的Observable扇丛,后者發(fā)射那些Observables最近發(fā)射的數(shù)據(jù)項(xiàng)

switch

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í)行。

Zip

通過一個(gè)函數(shù)將多個(gè)Observables的發(fā)射物結(jié)合到一起顽悼,基于這個(gè)函數(shù)的結(jié)果為每個(gè)結(jié)合體發(fā)射單個(gè)數(shù)據(jù)項(xiàng)曼振。

zip

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)為zipzipWith

zip

zip的最后一個(gè)參數(shù)接受每個(gè)Observable發(fā)射的一項(xiàng)數(shù)據(jù)屿愚,返回被壓縮后的數(shù)據(jù)汇跨,它可以接受一到九個(gè)參數(shù):一個(gè)Observable序列,或者一些發(fā)射Observable的Observables妆距。

zipWith

zip

zipWith操作符總是接受兩個(gè)參數(shù)穷遂,第一個(gè)參數(shù)是一個(gè)Observable或者一個(gè)Iterable。

zipzipWith默認(rèn)不在任何特定的操作符上執(zhí)行娱据。

錯(cuò)誤處理

很多操作符可用于對(duì)Observable發(fā)射的onError通知做出響應(yīng)或者從錯(cuò)誤中恢復(fù)蚪黑,例如,你可以:

  1. 吞掉這個(gè)錯(cuò)誤,切換到一個(gè)備用的Observable繼續(xù)發(fā)射數(shù)據(jù)
  2. 吞掉這個(gè)錯(cuò)誤然后發(fā)射默認(rèn)值
  3. 吞掉這個(gè)錯(cuò)誤并立即嘗試重啟這個(gè)Observable
  4. 吞掉這個(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

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

onErrorReturn方法返回一個(gè)鏡像原有Observable行為的新Observable,后者會(huì)忽略前者的onError調(diào)用盯拱,不會(huì)將錯(cuò)誤傳遞給觀察者盒发,作為替代,它會(huì)發(fā)發(fā)射一個(gè)特殊的項(xiàng)并調(diào)用觀察者的onCompleted方法坟乾。

onErrorResumeNext

onErrorResumeNext

onErrorResumeNext方法返回一個(gè)鏡像原有Observable行為的新Observable迹辐,后者會(huì)忽略前者的onError調(diào)用,不會(huì)將錯(cuò)誤傳遞給觀察者甚侣,作為替代明吩,它會(huì)開始鏡像另一個(gè),備用的Observable殷费。

onExceptionResumeNext

onExceptionResumeNext

onErrorResumeNext類似印荔,onExceptionResumeNext方法返回一個(gè)鏡像原有Observable行為的新Observable,也使用一個(gè)備用的Observable详羡,不同的是仍律,如果onError收到的Throwable不是一個(gè)Exception,它會(huì)將錯(cuò)誤傳遞給觀察者的onError方法实柠,不會(huì)使用備用的Observable水泉。

Retry

如果原始Observable遇到錯(cuò)誤,重新訂閱它期望它能正常終止

retry

Retry操作符不會(huì)將原始Observable的onError通知傳遞給觀察者窒盐,它會(huì)訂閱這個(gè)Observable草则,再給它一次機(jī)會(huì)無錯(cuò)誤地完成它的數(shù)據(jù)序列。Retry總是傳遞onNext通知給觀察者蟹漓,由于重新訂閱炕横,可能會(huì)造成數(shù)據(jù)項(xiàng)重復(fù),如上圖所示葡粒。

RxJava中的實(shí)現(xiàn)為retryretryWhen份殿。

無論收到多少次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í)行。

retryWhen

retryWhen

retryWhenretry類似似扔,區(qū)別是吨些,retryWhenonError中的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

輔助操作

這個(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

Delay操作符讓原始Observable在發(fā)射每項(xiàng)數(shù)據(jù)之前都暫停一段指定的時(shí)間段。效果是Observable發(fā)射的數(shù)據(jù)項(xiàng)在時(shí)間上向前整體平移了一個(gè)增量瘪撇。

RxJava的實(shí)現(xiàn)是 delaydelaySubscription获茬。

delay

第一種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)度器。

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í)行。

delay

這個(gè)版本的delay對(duì)每一項(xiàng)數(shù)據(jù)使用一個(gè)Observable作為原始Observable的延時(shí)定時(shí)器虹脯。

這種delay默認(rèn)不在任何特定的調(diào)度器上執(zhí)行驴娃。

delay

還有一個(gè)操作符delaySubscription讓你你可以延遲訂閱原始Observable。它結(jié)合搜一個(gè)定義延時(shí)的參數(shù)循集。

delaySubscription默認(rèn)在computation調(diào)度器上執(zhí)行唇敞,你可以通過參數(shù)指定使用其它的調(diào)度器。

delay

還有一個(gè)版本的delaySubscription使用一個(gè)Obseable而不是一個(gè)固定的時(shí)長(zhǎng)來設(shè)置訂閱延時(shí)暇榴。

這種delaySubscription默認(rèn)不在任何特定的調(diào)度器上執(zhí)行厚棵。

Do

注冊(cè)一個(gè)動(dòng)作作為原始Observable生命周期事件的一種占位符

do

你可以注冊(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

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一樣宋列。

doOnNext

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

doOnSubscribe操作符注冊(cè)一個(gè)動(dòng)作灭返,當(dāng)觀察者訂閱它生成的Observable它就會(huì)被調(diào)用。

doOnUnsubscribe

doOnUnsubscribe

doOnUnsubscribe操作符注冊(cè)一個(gè)動(dòng)作坤邪,當(dāng)觀察者取消訂閱它生成的Observable它就會(huì)被調(diào)用熙含。

doOnCompleted

doOnCompleted

doOnCompleted 操作符注冊(cè)一個(gè)動(dòng)作,當(dāng)它產(chǎn)生的Observable正常終止調(diào)用onCompleted時(shí)會(huì)被調(diào)用艇纺。

doOnError

doOnError

doOnError 操作符注冊(cè)一個(gè)動(dòng)作怎静,當(dāng)它產(chǎn)生的Observable異常終止調(diào)用onError時(shí)會(huì)被調(diào)用。

doOnTerminate

doOnTerminate

doOnTerminate 操作符注冊(cè)一個(gè)動(dòng)作黔衡,當(dāng)它產(chǎn)生的Observable終止之前會(huì)被調(diào)用蚓聘,無論是正常還是異常終止。

finallyDo

finallyDo

finallyDo 操作符注冊(cè)一個(gè)動(dòng)作员帮,當(dāng)它產(chǎn)生的Observable終止之后會(huì)被調(diào)用或粮,無論是正常還是異常終止。

Materialize/Dematerialize

Materialize將數(shù)據(jù)項(xiàng)和事件通知都當(dāng)做數(shù)據(jù)項(xiàng)發(fā)射捞高,Dematerialize剛好相反氯材。

materialize

一個(gè)合法的有限的Obversable將調(diào)用它的觀察者的onNext方法零次或多次,然后調(diào)用觀察者的onCompletedonError正好一次硝岗。Materialize操作符將這一系列調(diào)用氢哮,包括原來的onNext通知和終止通知onCompletedonError都轉(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í)行脓钾。

dematerialize

Dematerialize操作符是Materialize的逆向過程类嗤,它將Materialize轉(zhuǎn)換的結(jié)果還原成它原本的形式。

dematerialize反轉(zhuǎn)這個(gè)過程家破,將原始Observable發(fā)射的Notification對(duì)象還原成Observable的通知仓坞。

dematerialize默認(rèn)不在任何特定的調(diào)度器 (Scheduler) 上執(zhí)行背零。

ObserveOn

指定一個(gè)觀察者在哪個(gè)調(diào)度器上觀察這個(gè)Observable

observeOn

很多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方法)无埃。

observeOn

注意:當(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伍派。

Serialize

強(qiáng)制一個(gè)Observable連續(xù)調(diào)用并保證行為正確

img

一個(gè)Observable可以異步調(diào)用它的觀察者的方法,可能是從不同的線程調(diào)用剩胁。這可能會(huì)讓Observable行為不正確,它可能會(huì)在某一個(gè)onNext調(diào)用之前嘗試調(diào)用onCompletedonError方法祥国,或者從兩個(gè)不同的線程同時(shí)調(diào)用onNext方法昵观。使用Serialize操作符,你可以糾正這個(gè)Observable的行為舌稀,保證它的行為是正確的且是同步的啊犬。

RxJava中的實(shí)現(xiàn)是serialize,它默認(rèn)不在任何特定的調(diào)度器上執(zhí)行壁查。

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í)叫做ObserverSubscriber):

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)用onNextonCompleted碉纺。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ì)按下面的方法解釋:

  1. onNext
  2. onNextonError
  3. onNext, onErroronCompleted

最后慨亲,你還可以傳遞一個(gè)ObserverSubscriber接口給它婚瓜,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)系碍舍。

foreach

forEach方法是簡(jiǎn)化版的subscribe柠座,你同樣可以傳遞一到三個(gè)函數(shù)給它,解釋和傳遞給subscribe時(shí)一樣片橡。

不同的是妈经,你無法使用forEach返回的對(duì)象取消訂閱。也沒辦法傳遞一個(gè)可以用于取消訂閱的參數(shù)捧书。因此吹泡,只有當(dāng)你明確地需要操作Observable的所有發(fā)射物和通知時(shí),你才應(yīng)該使用這個(gè)操作符鳄厌。

BlockingObservable

BlockingObservable類中也有一個(gè)類似的叫作forEach的方法荞胡。詳細(xì)的說明見 BlockingObservable

SubscribeOn

指定Observable自身在哪個(gè)調(diào)度器上執(zhí)行

SubscribeOn

很多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操作符萝勤。

TimeInterval

將一個(gè)發(fā)射數(shù)據(jù)的Observable轉(zhuǎn)換為發(fā)射那些數(shù)據(jù)發(fā)射時(shí)間間隔的Observable

TimeInterval

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ù)修改。

Timeout

對(duì)原始Observable的一個(gè)鏡像蕾盯,如果過了一個(gè)指定的時(shí)長(zhǎng)仍沒有發(fā)射數(shù)據(jù)幕屹,它會(huì)發(fā)一個(gè)錯(cuò)誤通知

Timeout

如果原始Observable過了指定的一段時(shí)長(zhǎng)沒有發(fā)射任何數(shù)據(jù),Timeout操作符會(huì)以一個(gè)onError通知終止這個(gè)Observable。

RxJava中的實(shí)現(xiàn)為timeout望拖,但是有好幾個(gè)變體渺尘。

Timeout

第一個(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)度器迅诬。

Timeout

這個(gè)版本的timeout在超時(shí)時(shí)會(huì)切換到使用一個(gè)你指定的備用的Observable,而不是發(fā)錯(cuò)誤通知婿牍。它也默認(rèn)在computation調(diào)度器上執(zhí)行侈贷。

Timeout

這個(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í)行搏屑。

Timeout

這個(gè)版本的timeout同時(shí)指定超時(shí)時(shí)長(zhǎng)和備用的Observable。它默認(rèn)在immediate調(diào)度器上執(zhí)行粉楚。

Timeout

這個(gè)版本的time除了給每一項(xiàng)設(shè)置超時(shí)辣恋,還可以單獨(dú)給第一項(xiàng)設(shè)置一個(gè)超時(shí)。它默認(rèn)在immediate調(diào)度器上執(zhí)行模软。

Timeout

同上伟骨,但是同時(shí)可以指定一個(gè)備用的Observable。它默認(rèn)在immediate調(diào)度器上執(zhí)行燃异。

Timestamp

給Observable發(fā)射的數(shù)據(jù)項(xiàng)附加一個(gè)時(shí)間戳

Timestamp

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)度器。

Using

創(chuàng)建一個(gè)只在Observable生命周期內(nèi)存在的一次性資源

using

Using操作符讓你可以指示Observable創(chuàng)建一個(gè)只在它的生命周期內(nèi)存在的資源仅颇,當(dāng)Observable終止時(shí)這個(gè)資源會(huì)被自動(dòng)釋放单默。

using

using操作符接受三個(gè)參數(shù):

  1. 一個(gè)用戶創(chuàng)建一次性資源的工廠函數(shù)
  2. 一個(gè)用于創(chuàng)建Observable的工廠函數(shù)
  3. 一個(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í)行线欲。

To

將Observable轉(zhuǎn)換為另一個(gè)對(duì)象或數(shù)據(jù)結(jié)構(gòu)

to

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

getIterator操作符只能用于BlockingObservable的子類嗜憔,要使用它,你首先必須把原始的Observable轉(zhuǎn)換為一個(gè)BlockingObservable氏仗〖罚可以使用這兩個(gè)操作符:BlockingObservable.fromthe Observable.toBlocking

這個(gè)操作符將Observable轉(zhuǎn)換為一個(gè)Iterator皆尔,你可以通過它迭代原始Observable發(fā)射的數(shù)據(jù)集呐舔。

toFuture

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()浪感。

toIterable

toIterable

toFuture操作符也是只能用于BlockingObservable昔头。這個(gè)操作符將Observable轉(zhuǎn)換為一個(gè)Iterable,你可以通過它迭代原始Observable發(fā)射的數(shù)據(jù)集影兽。

toList

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)用了onErrortoList返回的Observable會(huì)立即調(diào)用它的觀察者的onError方法镶蹋。

toList默認(rèn)不在任何特定的調(diào)度器上執(zhí)行成艘。

toMap

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í)行断箫。

toMultiMap

toMultiMap

toMultiMap類似于toMap,不同的是秋冰,它生成的這個(gè)Map同時(shí)還是一個(gè)ArrayList(默認(rèn)是這樣仲义,你可以傳遞一個(gè)可選的工廠方法修改這個(gè)行為)。

toMultiMap默認(rèn)不在任何特定的調(diào)度器上執(zhí)行剑勾。

toSortedList

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í)行。

Rxjava操作符五

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載绪商,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者苛谷。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市格郁,隨后出現(xiàn)的幾起案子腹殿,更是在濱河造成了極大的恐慌,老刑警劉巖例书,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锣尉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡决采,警方通過查閱死者的電腦和手機(jī)自沧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來树瞭,“玉大人拇厢,你說我怎么就攤上這事∩古纾” “怎么了孝偎?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)凉敲。 經(jīng)常有香客問我衣盾,道長(zhǎng)寺旺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任势决,我火速辦了婚禮阻塑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘徽龟。我一直安慰自己叮姑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布据悔。 她就那樣靜靜地躺著传透,像睡著了一般。 火紅的嫁衣襯著肌膚如雪极颓。 梳的紋絲不亂的頭發(fā)上朱盐,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音菠隆,去河邊找鬼兵琳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛骇径,可吹牛的內(nèi)容都是我干的躯肌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼破衔,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼清女!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起晰筛,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤嫡丙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后读第,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體曙博,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年怜瞒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了父泳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盼砍,死狀恐怖尘吗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浇坐,我是刑警寧澤睬捶,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站近刘,受9級(jí)特大地震影響擒贸,放射性物質(zhì)發(fā)生泄漏臀晃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赘理,春花似錦、人聲如沸险绘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宦棺。三九已至,卻和暖如春黔帕,著一層夾襖步出監(jiān)牢的瞬間代咸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國打工成黄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呐芥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓奋岁,卻偏偏與公主長(zhǎng)得像思瘟,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子闻伶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一潮太、RxJava操作符概述 RxJava中的操作符就是為了提供函數(shù)式的特性,函數(shù)式最大的好處就是使得數(shù)據(jù)處理簡(jiǎn)潔易...
    無求_95dd閱讀 2,991評(píng)論 0 21
  • 一虾攻、RxJava操作符概述 RxJava中的操作符就是為了提供函數(shù)式的特性,函數(shù)式最大的好處就是使得數(shù)據(jù)處理簡(jiǎn)潔易...
    測(cè)天測(cè)地測(cè)空氣閱讀 626評(píng)論 0 1
  • RxJava正在Android開發(fā)者中變的越來越流行更鲁。唯一的問題就是上手不容易霎箍,尤其是大部分人之前都是使用命令式編...
    劉啟敏閱讀 1,849評(píng)論 1 7
  • 創(chuàng)建操作 用于創(chuàng)建Observable的操作符Create通過調(diào)用觀察者的方法從頭創(chuàng)建一個(gè)ObservableEm...
    rkua閱讀 1,814評(píng)論 0 1
  • 花了兩天的時(shí)間才把《中國哲學(xué)簡(jiǎn)史》第二章閱讀完。這章主要是談“中國哲學(xué)的背景”澡为∑担“背景”含括比較多的內(nèi)容:地...
    小里脊閱讀 646評(píng)論 0 5