1. 程式人生 > >[Android開發] RxJava2之路十一- 算術和聚合操作符例子Demo

[Android開發] RxJava2之路十一- 算術和聚合操作符例子Demo

一、算術和聚合操作符列表

1.1 算術操作符RXjava-math:

這個模組需要導下面這個包,不支援Rxjava2,所以Rxjava2用不了噢:

    compile 'io.reactivex:rxjava-math:1.0.0'
名稱 解析
averageInteger() 求序列平均數併發射
averageLong() 求序列平均數併發射
averageFloat() 求序列平均數併發射
averageDouble() 求序列平均數併發射
max() 求序列最大值併發射
maxBy() 求最大key對應的值併發射
min() 求最小值併發射
minBy() 求最小Key對應的值併發射
sumInteger() 求和併發射
sumLong() 求和併發射
sumFloat() 求和併發射
sumDouble() 求和併發射

1.2 其他聚合操作符:

名稱 解析
concat() / concatArray 順序連線多個Observables
count() 計算資料項的個數併發射結果
reduce() 按順序對Observable發射的每項資料應用一個函式併發射最終的值
collect() 將原始Observable發射的資料放到一個單一的可變的資料結構中,然後返回一個發射這個資料結構的Observable
toList() 收集原始Observable發射的所有資料到一個列表,然後返回這個列表
toSortedList() 收集原始Observable發射的所有資料到一個有序列表,然後返回這個列表
toMap() 將序列資料轉換為一個Map,Map的key是根據一個函式計算的
toMultiMap() 將序列資料轉換為一個列表,同時也是一個Map,Map的key是根據一個函式計算的

ps: 由於這些操作必須等待資料發射完成(通常也必須快取這些資料),它們對於非常長或者無限的序列來說是危險的,不推薦使用。

二、聚合操作符

2.1 concat() / concatArray

順序連線多個Observables。

    /**
     * 順序連線多個Observables
     */
    private void testConcat() {
        Observable.concat(Observable.just(Observable.just("1"),Observable.just("2")))
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(@NonNull String s) throws Exception {
                        Log.e(TAG, "accept: "+s);
                    }
                });


        Observable.concat(Observable.just("3","4"),Observable.just("5","6"))
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(@NonNull String s) throws Exception {
                        Log.e(TAG, "accept: "+s);
                    }
                });

    }

輸出內容為:

03-02 19:13:01.275 29166-29166/cn.com.minstone.rxjavalearn E/[email protected]@: accept: 1
03-02 19:13:01.275 29166-29166/cn.com.minstone.rxjavalearn E/[email protected]@: accept: 2
03-02 19:13:01.277 29166-29166/cn.com.minstone.rxjavalearn E/[email protected]@: accept: 3
03-02 19:13:01.277 29166-29166/cn.com.minstone.rxjavalearn E/[email protected]@: accept: 4
03-02 19:13:01.277 29166-29166/cn.com.minstone.rxjavalearn E/[email protected]@: accept: 5
03-02 19:13:01.277 29166-29166/cn.com.minstone.rxjavalearn E/[email protected]@: accept: 6

2.2 count()操作符

計算資料項的個數。返回 long型別

    private void testCount() {

        Observable.just("1", "2")
                .count()
                .subscribe(new Consumer<Long>() {
                    @Override
                    public void accept(@NonNull Long aLong) throws Exception {
                        Log.e(TAG, "accept: "+aLong);

                    }
                });

    }

輸出:

03-02 19:13:01.275 29166-29166/cn.com.minstone.rxjavalearn E/[email protected]@: accept: 2

2.3 reduce()操作符

第一次獲取到前兩個資料,之後每次獲取到的資料是返回的資料+原始的下一個資料。最後返回到觀察者

        Observable.just("1","2","3","4")
                .reduce(new BiFunction<String, String, String>() {
                    @Override
                    public String apply(@NonNull String s, @NonNull String s2) throws Exception {
                        Log.e(TAG, "apply: "+s +" "+ s2);

                        return "返回值";
                    }
                }).subscribe(new Consumer<String>() {
                    @Override
                    public void accept(@NonNull String s) throws Exception {
                        Log.e(TAG, "accept: "+s);

                    }
                });

輸出為:

03-02 19:27:14.758 2983-2983/cn.com.minstone.rxjavalearn E/[email protected]@: apply: 1 2
03-02 19:27:14.758 2983-2983/cn.com.minstone.rxjavalearn E/[email protected]@: apply: 返回值 3
03-02 19:27:14.758 2983-2983/cn.com.minstone.rxjavalearn E/[email protected]@: apply: 返回值 4
03-02 19:27:14.758 2983-2983/cn.com.minstone.rxjavalearn E/[email protected]@: accept: 返回值

2.4 collect()操作符

和reduce類似,但是collect可以變型別。


    private void testCollect() {

        Observable.just("1","2","3","4")
                .collect(new Callable<Integer>() {
                    @Override
                    public Integer call() throws Exception {
                        return 6;
                    }
                }, new BiConsumer<Integer, String>() {
                    @Override
                    public void accept(@NonNull Integer integer, @NonNull String s) throws Exception {
                        Log.e(TAG, "accept: "+integer+" "+ s);
                    }
                })
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(@NonNull Integer integer) throws Exception {
                        Log.e(TAG, "accept2: "+integer);

                    }
                });



    }

輸出的內容為:

03-02 19:34:23.382 5108-5108/cn.com.minstone.rxjavalearn E/[email protected]@: accept: 6 1
03-02 19:34:23.382 5108-5108/cn.com.minstone.rxjavalearn E/[email protected]@: accept: 6 2
03-02 19:34:23.383 5108-5108/cn.com.minstone.rxjavalearn E/[email protected]@: accept: 6 3
03-02 19:34:23.383 5108-5108/cn.com.minstone.rxjavalearn E/[email protected]@: accept: 6 4
03-02 19:34:23.383 5108-5108/cn.com.minstone.rxjavalearn E/[email protected]@: accept2: 6

2.5 toList / toSortedList()操作符

收集原始Observable發射的所有資料到一個列表,然後返回這個列表

    private void testToList() {

        Observable.just("1","2","3","4")
                .toList()
                .subscribe(new Consumer<List<String>>() {
                    @Override
                    public void accept(@NonNull List<String> strings) throws Exception {
                        for(String str:strings){
                            Log.e(TAG, "accept: "+str);
                        }
                    }
                });
    }

輸出結果為:

03-02 19:40:06.437 7578-7578/cn.com.minstone.rxjavalearn E/[email protected]@: accept: 1
03-02 19:40:06.437 7578-7578/cn.com.minstone.rxjavalearn E/[email protected]@: accept: 2
03-02 19:40:06.437 7578-7578/cn.com.minstone.rxjavalearn E/[email protected]@: accept: 3
03-02 19:40:06.437 7578-7578/cn.com.minstone.rxjavalearn E/[email protected]@: accept: 4

2.7 ToSortedList()操作符

和toList基本一致,但是ToSortedList可以自定義排序:

    private void testToSortedList() {

        Observable.just(1,2,3,4)
                .toSortedList(new TestComparator())
                .subscribe(new Consumer<List<Integer>>() {
                    @Override
                    public void accept(@NonNull List<Integer> integers) throws Exception {
                        for(Integer str:integers){
                            Log.e(TAG, "accept: "+str);
                        }
                    }
                });
    }

    public class TestComparator implements Comparator<Integer> {
        public int compare(Integer o1, Integer o2) {
            return o2- o1;
        }
    }

輸出的內容就為倒序啦:

03-02 19:47:39.637 10924-10924/cn.com.minstone.rxjavalearn E/[email protected]@: accept: 4
03-02 19:47:39.637 10924-10924/cn.com.minstone.rxjavalearn E/[email protected]@: accept: 3
03-02 19:47:39.637 10924-10924/cn.com.minstone.rxjavalearn E/[email protected]@: accept: 2
03-02 19:47:39.637 10924-10924/cn.com.minstone.rxjavalearn E/[email protected]@: accept: 1

2.6 toMap / toMultiMap()操作符

和tolist思路差不多,toMap將序列資料轉換為一個Map,Map的key是根據一個函式計算的


    private void testToMap() {

        Observable.just(1,2,3,4)
                .toMap(new Function<Integer, String>() {
                    @Override
                    public String apply(@NonNull Integer integer) throws Exception {
                        //計算返回每個資料對應的key,這裡設定key為他本身
                        return integer+"";
                    }
                })
                .subscribe(new Consumer<Map<String, Integer>>() {
                    @Override
                    public void accept(@NonNull Map<String, Integer> map) throws Exception {
                        for (String key : map.keySet()) {
                            Log.e(TAG,"key= "+ key + ",value= " + map.get(key));
                        }


                    }
                });
    }

輸出內容為:

03-02 19:52:18.471 12321-12321/cn.com.minstone.rxjavalearn E/[email protected]@: key= 4,value= 4
03-02 19:52:18.471 12321-12321/cn.com.minstone.rxjavalearn E/[email protected]@: key= 1,value= 1
03-02 19:52:18.471 12321-12321/cn.com.minstone.rxjavalearn E/[email protected]@: key= 2,value= 2
03-02 19:52:18.471 12321-12321/cn.com.minstone.rxjavalearn E/[email protected]@: key= 3,value= 3

toMultimap和tomap不同的是,toMultimap處理之後的mao的value為Collection列表

相關推薦

[Android開發] RxJava2- 算術聚合操作符例子Demo

一、算術和聚合操作符列表 1.1 算術操作符RXjava-math: 這個模組需要導下面這個包,不支援Rxjava2,所以Rxjava2用不了噢: compile 'io.reactivex:rxjava-math:1.0.0' 名稱

[Android開發] RxJava2

一、條件操作符列表 根據條件發射或變換Observables 名稱 解析 amb() 給定多個Observable,只讓第一個發射資料的Observable發射全部資料 defaultIfEmpty() 發射來自原始O

[Android開發] RxJava2

一、過濾操作符列表 用於過濾和選擇Observable發射的資料序列 方法 含義 filter() 過濾資料 takeLast() 只發射最後的N項資料 last() 只發射最後的一項資料 last

[Android開發] Rxjava2: Rxbinding2(支援基於Rxjava2)

支援Rxjava2的Rxbinding已經在2017年3月6號更新,你只需要依賴以下程式碼即可,預設Rxjava版本為2.0.2,RxAndroid為2.0.0: compile 'com.jakewharton.rxbinding2:rxbinding:

Android開發學習--異步消息Handler,Message,LooperAsyncTask初體驗

被調用 project 輸入 gettext npos article app sso 音樂播放 在簡易音樂播放器中。用了Handler。也沒有過多地去研究學習,這裏再學習下android下的異步消息處理機制。這裏用了Handler主要是在線程中不能更新UI

Android開發學習--圖表實現(achartengine/MPAndroidChart)初體驗

bundle 喜歡 嵌入式linux Y軸 tid ren sca ref java代碼 ??已經有一段時間沒有更新博客了,在上周離開工作了4年的公司,從此不再安安穩穩地工作了。很多其它的是接受挑戰和實現自身價值的提高。離開了嵌入式linux,從此擁抱移

Android開發實戰(二):淺談android:clipChildren屬性

.cn viewpage port 部分 lap ole 有一個 默認 版本 原文:Android開發實戰(二十一):淺談android:clipChildren屬性實現功能: 1、APP主界面底部模塊欄 2、ViewPager一屏多個界面顯示 3、........

JAVA開發血淚步步搭建spring框架

適配 param 實例 list ans oca 容器管理 simple inf 前言 作為一個服務端開發感覺一直挺排斥框架這種東西的,總覺得什麽實現邏輯都幫你封裝在裏面了,你只需要配置這配置那個,出了問題也不知道怎麽排查,之前即使寫web程序也寧願使用jetty這樣的嵌入

Android開發學習-EventBus使用

轉載自: https://www.cnblogs.com/Fndroid/p/5910992.html EventBus是一個通過釋出、訂閱事件實現元件間訊息傳遞的工具。 它存在的目的,就是為了優化元件之間傳遞訊息的過程。傳統元件之間傳遞訊息的方法有使用廣播,回撥等,而這些方法使用都比較

Android開發 - 掌握ConstraintLayout()複雜動畫!如此簡單!

介紹 本系列我們已經介紹了ConstraintLayout的基本用法。學習到這裡,相信你已經熟悉ConstraintLayout的基本使用了,如果你對它的用法還不瞭解,建議您先閱讀我之前的文章。 使用ConstraintLayout建立動畫的基本思想是我們建立兩個不同的佈局,每個佈局有其不同的約束,從而我

Android開發學習--Android Studio外掛開發

前言 因為使用了mvp和dagger,所以每次新的一個功能頁面都需要重新寫一堆東西,比如Activity, Fragment, Presenter,dagger等,而這些程式碼基本上都是大同小異,完全可以寫一個模板,然後生成,略微修改便可以完成我們需要的功能。

Android開發學習--Drawable mutations

  時間過得很快,明天終於可以拿到房子了,交完這次房租,也可以成為房東了,看看部落格也好久沒有更新了,最近一直在整機器人,也沒有太多時間整理部落格。   今天下午和同事一起遇到了一個問題,就是明明沒有

Android開發學習--RxAndroid簡單原理

  學習了RxAndroid,其實也就是RxJava了,但是還是不是非常清楚到底RxAndroid有什麼用呢?為什麼要使用RxAndroid呢?這篇文章講得不錯,RxJava的原理。但是這裡還是把整個過

Android開發學習--Activity初體驗

    環境也搭建好了,android系統也基本瞭解了,那麼接下來就可以開始學習android開發了,相信這麼學下去肯定可以把android開發學習好的,再加上時而再溫故下linux下的知識,看看an

Java () -- 持有物件(Collection、List、Set、Queue、Map、Iterator、foreach)

本章將簡單介紹一下常用的集合類的特點,同時並不會深入原始碼分析原理,本文目的僅僅在於對 Java 集合類有一個整體認識 關於 API,本文不涉及過多,建議直接檢視 Java 官方文件 1. 容器概述 1.1 引入原因 Java 中,陣列用

Android原始碼解析)-->應用程序啟動流程

本節主要是通過分析Activity的啟動過程介紹應用程式程序的啟動流程。關於Android的應用程序在android guide中有這樣的一段描述: By default, every application runs in its own Linu

Android實戰技巧Android原型設計工具探索

移動開發者、移動產品經理和互動設計師在有了產品的想法後會做出一系列的草圖,然後反覆推敲改進,直到自己滿意。這個草圖就是原型設計,是產品設計初期很重要的工作,它是產品的雛形,之後會以此為原型進行開發。 當移動網際網路熱度增加後,一些主打移動原型設計的工具如雨後春

Android進階) -- AS 3.0NDK環境搭建及hello world

通過一段找實習的經歷,以及快應用、小程式、web app等移動開發模式的衝擊,深深為安卓原生開發的未來感到擔憂,希望接入人工智慧API和物聯網井噴能給安卓開發帶來新的生機吧。當然,作為小白我是不用擔心這麼多的,做自己喜歡的事就好了,於是拋開雜念,繼續學習安卓。NDK開發環境的

Android開發學習--在Android應用中愉快地寫C/C++程式碼

1 前言 一直想在android層面寫c程序,然後java可以與c程序互動,以前在android原始碼中想玩就可以直接在init.rc中加上交叉編譯好的c程序就可以了,而在ide中,也就是ndk編譯後各種許可權問題就有點不得而知了。花了幾天時間研究實踐,也終於

Android開發學習--Android Studio cmake編譯ffmpeg

  最新的android studio2.2引入了cmake可以很好地實現ndk的編寫。這裡使用最新的方式,對於以前的android下的ndk編譯什麼的可以參考之前的文章:Android開發學習之路–NDK、JNI之初體驗。 1.ffmpeg編譯