Rxjava實(shí)踐之路[初級(jí)篇]

前言

前面已經(jīng)講了Rxjava相關(guān)基礎(chǔ)以及基本使用,有不清楚的童鞋可以看Rxjava實(shí)踐之路[入門篇]。本章主要講過濾,如何從發(fā)射的Observable中選取想要的內(nèi)容以及學(xué)會(huì)更多有用的處理技巧。

正題

1、filter

  • 篩選符合條件的內(nèi)容
    /**
     * 篩選符合條件的內(nèi)容
     * @author leibing
     * @createTime 2016/09/18
     * @lastModify 2016/09/18
     * @param
     * @return
     */
    private void filterObservable(){
        // 使用filter方法過濾內(nèi)容中不需要的值
        Observable.just("A1","B1","A2","C3").filter(new Func1<String, Boolean>() {
            @Override
            public Boolean call(String s) {
                // 條件篩選以“A”開始的內(nèi)容
                return s.startsWith("A");
            }
        }).subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                // 打印結(jié)果
                System.out.println("ddddddddddddddddddd filter s = " + s);
            }
        });
    }

運(yùn)行結(jié)果如下:

09-18 14:32:29.978 25356-25356/cn.jianke.rxjavafilterdemo I/System.out: ddddddddddddddddddd filter s = A1
09-18 14:32:29.978 25356-25356/cn.jianke.rxjavafilterdemo I/System.out: ddddddddddddddddddd filter s = A2

2、take

  • 篩選出原始數(shù)據(jù)中前n個(gè)數(shù)據(jù)發(fā)射

    /**
     * 篩選出原始數(shù)據(jù)中前n個(gè)數(shù)據(jù)發(fā)射
     * @author leibing
     * @createTime 2016/09/18
     * @lastModify 2016/09/18
     * @param
     * @return
     */
    private void takeObservable(){
        // take(n) 提取原數(shù)據(jù)前n個(gè)數(shù)據(jù)發(fā)射
        Observable.just("1","2","3","4","5").take(4).subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                // 打印結(jié)果
                System.out.println("ddddddddddddddd take s = " + s);
            }
        });
    }

運(yùn)行結(jié)果如下:

09-18 14:46:21.894 424-424/cn.jianke.rxjavafilterdemo I/System.out: ddddddddddddddd take s = 1
09-18 14:46:21.894 424-424/cn.jianke.rxjavafilterdemo I/System.out: ddddddddddddddd take s = 2
09-18 14:46:21.894 424-424/cn.jianke.rxjavafilterdemo I/System.out: ddddddddddddddd take s = 3
09-18 14:46:21.895 424-424/cn.jianke.rxjavafilterdemo I/System.out: ddddddddddddddd take s = 4

3、takelast

  • 篩選出原始數(shù)據(jù)中從倒數(shù)前n個(gè)數(shù)據(jù)發(fā)射
   /**
     * 篩選出原始數(shù)據(jù)中從倒數(shù)前n個(gè)數(shù)據(jù)發(fā)射
     * @author leibing
     * @createTime 2016/09/18
     * @lastModify 2016/09/18
     * @param
     * @return
     */
    private void takeLastObservable(){
        // takeLast(n) 提取原數(shù)據(jù)倒數(shù)前n個(gè)數(shù)據(jù)發(fā)射
        Observable.just("1","2","3","4","5").takeLast(2).subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                // 打印結(jié)果
                System.out.println("dddddddddddddddddd takeLast s = " + s);
            }
        });
    }

4、distinct

  • 去掉數(shù)據(jù)中重復(fù)值
  /**
     * 去掉數(shù)據(jù)中重復(fù)值
     * @author leibing
     * @createTime 2016/09/18
     * @lastModify 2016/09/18
     * @param
     * @return
     */
    private void distinctObservable(){
        // 將發(fā)射數(shù)據(jù)重復(fù)五遍再去重復(fù)
        Observable.just("A1","A1","B1","C1","D1","B1","A1").repeat(5).distinct().subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                // 打印結(jié)果
                System.out.println("ddddddddddddddddd distinct s = " + s);
            }
        });
    }

運(yùn)行結(jié)果如下:

09-18 14:54:35.616 6187-6187/cn.jianke.rxjavafilterdemo I/System.out: ddddddddddddddddd distinct s = A1
09-18 14:54:35.616 6187-6187/cn.jianke.rxjavafilterdemo I/System.out: ddddddddddddddddd distinct s = B1
09-18 14:54:35.617 6187-6187/cn.jianke.rxjavafilterdemo I/System.out: ddddddddddddddddd distinct s = C1
09-18 14:54:35.617 6187-6187/cn.jianke.rxjavafilterdemo I/System.out: ddddddddddddddddd distinct s = D1

5、skip

  • 篩選出原始數(shù)據(jù)中前n個(gè)數(shù)據(jù)跳過不發(fā)射
    /**
     * 篩選出原始數(shù)據(jù)中前n個(gè)數(shù)據(jù)跳過不發(fā)射
     * @author leibing
     * @createTime 2016/09/18
     * @lastModify 2016/09/18
     * @param
     * @return
     */
    private void skipObservable(){
        // skip(n) 提取原數(shù)據(jù)前n個(gè)數(shù)據(jù)跳過不發(fā)射
        Observable.just("1","2","3","4","5").skip(4).subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                // 打印結(jié)果
                System.out.println("ddddddddddddddd skip s = " + s);
            }
        });
    }

運(yùn)行結(jié)果如下:

09-18 15:04:10.187 11687-11687/cn.jianke.rxjavafilterdemo I/System.out: ddddddddddddddd skip s = 5

6、skiplast

  • 篩選出原始數(shù)據(jù)中從倒數(shù)前n個(gè)數(shù)據(jù)跳過不發(fā)射
    /**
     * 篩選出原始數(shù)據(jù)中從倒數(shù)前n個(gè)數(shù)據(jù)跳過不發(fā)射
     * @author leibing
     * @createTime 2016/09/18
     * @lastModify 2016/09/18
     * @param
     * @return
     */
    private void skipLastObservable(){
        // takeLast(n) 提取原數(shù)據(jù)倒數(shù)前n個(gè)數(shù)據(jù)跳過不發(fā)射
        Observable.just("1","2","3","4","5").skipLast(2).subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                // 打印結(jié)果
                System.out.println("dddddddddddddddddd skipLast s = " + s);
            }
        });
    }

運(yùn)行結(jié)果如下:

09-18 15:05:31.576 11687-11687/cn.jianke.rxjavafilterdemo I/System.out: dddddddddddddddddd skipLast s = 1
09-18 15:05:31.577 11687-11687/cn.jianke.rxjavafilterdemo I/System.out: dddddddddddddddddd skipLast s = 2
09-18 15:05:31.578 11687-11687/cn.jianke.rxjavafilterdemo I/System.out: dddddddddddddddddd skipLast s = 3

7、timeout

  • 在指定的時(shí)間間隔內(nèi)Observable不發(fā)射值的話,監(jiān)聽的原始的Observable時(shí)就會(huì)觸發(fā)onError()函數(shù)
 /**
     * 在指定的時(shí)間間隔內(nèi)Observable不發(fā)射值的話,監(jiān)聽的原始的Observable時(shí)就會(huì)觸發(fā)onError()函數(shù)
     * @author leibing
     * @createTime 2016/09/18
     * @lastModify 2016/09/18
     * @param
     * @return
     */
    private void timeoutObservable(){
        // 指定4秒后再發(fā)射,再指定3秒后如果未發(fā)射就觸發(fā)onError函數(shù)
        Observable.just("1","2").timer(4, TimeUnit.SECONDS).timeout(3, TimeUnit.SECONDS).subscribe(
                new Observer<Long>() {
            @Override
            public void onCompleted() {
                System.out.println("dddddddddddddddd timeout onCompleted = ");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println("dddddddddddddddd timeout e = " + e.getMessage());
            }

            @Override
            public void onNext(Long aLong) {
                System.out.println("dddddddddddddddd timeout along = " + aLong);
            }
        });
    }

運(yùn)行結(jié)果如下:

09-18 15:28:34.142 25661-25812/cn.jianke.rxjavafilterdemo I/System.out: dddddddddddddddd timeout e = null

demo地址:RxjavaFilterDemo

總結(jié)

目前筆者覺得以上七種過濾比較實(shí)用,在此拋磚引玉,歡迎閱讀此文章的童鞋拍磚,多多指教!下章準(zhǔn)備寫Rxjava Observable變換的實(shí)踐總結(jié)!敬請(qǐng)關(guān)注!

作者

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • 創(chuàng)建unfaseCreate(create)創(chuàng)建一個(gè)Observable(被觀察者),當(dāng)被觀察者(Observer...
    chuwe1閱讀 7,135評(píng)論 3 8
  • 版權(quán)聲明:本文為小斑馬偉原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處! 上篇簡(jiǎn)單的闡述了響應(yīng)式編程的基本理論。這篇主要對(duì)響應(yīng)編程進(jìn)行詳...
    ZebraWei閱讀 3,222評(píng)論 0 2
  • 今天是和濤濤在一起的八百天。 說不上開心,也許是因?yàn)橐呀?jīng)習(xí)慣了; 說不上習(xí)慣,也許是因?yàn)槊刻斓男◇@喜。 對(duì)待我們的...
    tgtg閱讀 1,067評(píng)論 0 0
  • 這周2017.09.18-09.22 對(duì)于小太陽班的40多位家長(zhǎng)來說,是個(gè)瘋狂的星期,特別是今天09.22一把瘋狂...
    南沫有風(fēng)閱讀 409評(píng)論 0 0

友情鏈接更多精彩內(nèi)容