一緒に書く習慣をつけましょう!「ナゲッツデイリーニュープラン・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
オブジェクトを指定することによって機能し、オブザーバーは新しいオブジェクトを引き継いで処理します。Observable
Observable
Observable
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)
flatMap
1つを多数にObservable
変換しObservables
てから、それらが出力するデータを1つにまとめますObservable
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つずつObservable
でObservable
はなく毎回値のリストを出力する新しいObservableに変換します。
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
オリジナルObservable
をObservables
セットに分割します。各セットはオリジナルのObservableのサブシーケンスを発行し、Observable
各アイテムにキーを割り当てる関数によって決定されるデータアイテムが発行され、同じキーデータが同じものObservable
から発行さます。
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岁
复制代码