RxJava2で演算子を作成し、演算子を変換します

一緒に書く習慣をつけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して2日目です。クリックしてイベントの詳細をご覧ください

作成演算子

1.間隔

Observableタイマーと同等の、一定の間隔で放出される整数のシーケンスを作成します。

Observable
    .interval(3, TimeUnit.SECONDS)//指定时间间隔以及时间的单位
    .subscribe(new Consumer<Long>() {
        @Override
        public void accept(Long aLong) throws Exception {
            Log.i(TAG, "accept: "+aLong);
        }
    });
复制代码

結果は

01-25 14:48:08.920 16172-16199/com.xp.note.rxjava I/RxJavaActivity30: onNext: 31
01-25 14:48:11.919 16172-16199/com.xp.note.rxjava I/RxJavaActivity30: onNext: 32
01-25 14:48:14.920 16172-16199/com.xp.note.rxjava I/RxJavaActivity30: onNext: 33
复制代码

2.範囲

forループと同様に、指定された範囲を出力する整数のシーケンスを作成しますObservable。値の範囲は左側で閉じ、右側で開きます。

Observable
    .range(0,3)
    .subscribe(new Consumer<Integer>() {
        @Override
        public void accept(Integer integer) throws Exception {
            Log.i(TAG, "accept: "+integer);
        }
    });
复制代码

結果は

01-25 14:55:39.341 16711-16711/com.xp.note.rxjava I/RxJavaActivity30: accept: 0
01-25 14:55:40.341 16711-16711/com.xp.note.rxjava I/RxJavaActivity30: accept: 1
01-25 14:55:41.343 16711-16711/com.xp.note.rxjava I/RxJavaActivity30: accept: 2
复制代码

3.リピート

データのnエミッションリピートを作成しますObservable

Observable
    .range(0,2)
    .repeat(2)//重复次数
    .subscribe(new Consumer<Integer>() {
        @Override
        public void accept(Integer integer) throws Exception {
            Log.i(TAG, "accept: "+integer);
        }
    });
复制代码

出力結果

01-25 15:03:50.446 17017-17017/com.xp.note.rxjava I/RxJavaActivity30: accept: 0
01-25 15:03:50.446 17017-17017/com.xp.note.rxjava I/RxJavaActivity30: accept: 1
01-25 15:03:50.446 17017-17017/com.xp.note.rxjava I/RxJavaActivity30: accept: 0
01-25 15:03:50.446 17017-17017/com.xp.note.rxjava I/RxJavaActivity30: accept: 1
复制代码

変換演算子

変換演算子の機能は、Observable特定のルールに従って送信データに対していくつかの変換操作を実行してから、変換されたデータを送信することです。

1.マップ

マップ演算子は、新しいオブジェクトに変換されて放出されるFunctionオブジェクトを指定することによって機能し、オブザーバーは新しいオブジェクトを引き継いで処理します。ObservableObservableObservable

Observable.range(0,5).map(new Function<Integer, String>() {
    @Override
    public String apply(Integer integer) throws Exception {
        return "转换之后:"+integer;
    }
	}).subscribe(new Consumer<String>() {
	    @Override
	    public void accept(String s) throws Exception {
	        Log.i("TAG", "accept: "+s);
	    }
	});
复制代码

出力結果

01-29 21:08:25.157 17201-17201/com.xp.note.rxjava I/TAG: accept: 转换之后:0
01-29 21:08:25.158 17201-17201/com.xp.note.rxjava I/TAG: accept: 转换之后:1
01-29 21:08:25.158 17201-17201/com.xp.note.rxjava I/TAG: accept: 转换之后:2
01-29 21:08:25.158 17201-17201/com.xp.note.rxjava I/TAG: accept: 转换之后:3
01-29 21:08:25.158 17201-17201/com.xp.note.rxjava I/TAG: accept: 转换之后:4

复制代码

2.flatMap(concatMap)

flatMap1つを多数にObservable変換しObservablesてから、それらが出力するデータを1つにまとめますObservable 1167421-7728bea372bd612c.png

 Observable.range(0, 5)
    .flatMap(new Function<Integer, ObservableSource<String>>() {
        @Override
        public ObservableSource<String> apply(Integer integer) throws Exception {
            return Observable.fromArray(integer + "");
        }
    }).subscribe(new Consumer<String>() {
        @Override
        public void accept(String s) throws Exception {
            Log.i("TAG", "accept: " + s);
        }
    });
复制代码

concatMapとflatMapは同じ機能を持ち、データを出力するObservableを複数のObservableに変換してから、それらが出力するデータを単一のObservableに配置します。最終的にObservablesがマージされ、flatMapによってマージが使用され、concatMap(concat)によって接続が使用されるだけです。つまり、これらの違いは次のとおりです。concatMapは順序付けられ、flatMapは順序付けられておらず、concatMapの最終出力順序は元のシーケンスと一致していますが、flatMapは必ずしもそうではなく、インターリーブが存在する可能性があります。

結果出力

01-29 22:43:34.796 29345-29469/com.xp.note.rxjava I/TAG: accept: 0
01-29 22:43:34.796 29345-29469/com.xp.note.rxjava I/TAG: accept: 1
01-29 22:43:34.796 29345-29469/com.xp.note.rxjava I/TAG: accept: 2
01-29 22:43:34.796 29345-29469/com.xp.note.rxjava I/TAG: accept: 3
01-29 22:43:34.796 29345-29469/com.xp.note.rxjava I/TAG: accept: 4
复制代码

マップは1対1の変換に適していますが、もちろんフラットマップでも使用できます。

フラットマップは、1対多、多対多のシナリオに適しています

Flatmapは、ループのネストを解決するために使用できます。別のシナリオは、2つのインターフェースを連続して要求することです。最初のインターフェースの戻り値は、2番目のインターフェースの要求パラメーターです。onResponseで結果を取得してから、別のインターフェースを要求します。この種のインターフェースはネストされており、コードは非常に見苦しく見えます。flatMapを使用すると、この問題を非常にうまく解決できます。コードは非常にエレガントで論理的に明確に見えます。注文を保証する必要がある場合は、concatMapを使用してください

より多くのオペレーター

3.バッファ

buffer元のObservableを、1つずつObservableObservableはなく毎回値のリストを出力する新しいObservableに変換します。

aaa8dc.jpg

Observable.range(0, 7)
            .buffer(3)
            .subscribe(new Consumer<List<Integer>>() {//参数是List而不是Integer,说明发射了一组
                @Override
                public void accept(List<Integer> integers) throws Exception {
                    Log.i("TAG", "accept: " + integers.size());
                }
            });
复制代码

結果出力

04-19 22:00:12.901 11686-11686/com.xp.note.rxjava I/TAG: accept: 3
04-19 22:00:12.902 11686-11686/com.xp.note.rxjava I/TAG: accept: 3
04-19 22:00:12.902 11686-11686/com.xp.note.rxjava I/TAG: accept: 1
复制代码

4.groupBy

groupByオリジナルObservableObservablesセットに分割します。各セットはオリジナルのObservableのサブシーケンスを発行し、Observable各アイテムにキーを割り当てる関数によって決定されるデータアイテムが発行され、同じキーデータが同じものObservableから発行さます。iamge

    User user1 = new User("张三丰",100);
    User user2 = new User("张翠山",30);
    User user3 = new User("张无极",18);
    User user4 = new User("珠儿",15);
    User user5 = new User("周芷若",16);
    User user6 = new User("小昭",15);
    User user7 = new User("白眉鹰王",100);

    Observable<GroupedObservable<Integer,User>> obs = Observable.just(user1, user2, user3, user4, user5, user6, user7)
            .groupBy(new Function<User, Integer>() {
        @Override
        public Integer apply(User user) throws Exception {
            return user.getAge();
        }
    });
    Observable.concat(obs).subscribe(new Consumer<User>() {
        @Override
        public void accept(User user) throws Exception {
            Log.i("TAG", "accept: "+user.toString());
        }
    });
复制代码

結果出力

04-19 22:00:12.950 11686-11686/com.xp.note.rxjava I/TAG: accept: 张三丰 100岁
04-19 22:00:12.951 11686-11686/com.xp.note.rxjava I/TAG: accept: 白眉鹰王 100岁
04-19 22:00:12.953 11686-11686/com.xp.note.rxjava I/TAG: accept: 张翠山 30岁
04-19 22:00:12.953 11686-11686/com.xp.note.rxjava I/TAG: accept: 张无极 18岁
04-19 22:00:12.954 11686-11686/com.xp.note.rxjava I/TAG: accept: 珠儿 15岁
04-19 22:00:12.954 11686-11686/com.xp.note.rxjava I/TAG: accept: 小昭 15岁
04-19 22:00:12.954 11686-11686/com.xp.note.rxjava I/TAG: accept: 周芷若 16岁

复制代码

おすすめ

転載: juejin.im/post/7082344250666385421