ホームページ > Java > &#&チュートリアル > RxJava_06の詳細を徹底解説【送信処理の条件と組み合わせ動作】

RxJava_06の詳細を徹底解説【送信処理の条件と組み合わせ動作】

黄舟
リリース: 2017-03-04 09:58:12
オリジナル
1490 人が閲覧しました


このチュートリアルは RxJava1 の条件に基づいています。

all - Observable によって発行されたすべてのデータが特定の条件を満たすかどうかを判断します。元の Observable のデータが条件を満たさない場合、False を返します。 1 つはデータの最初に送信され、後者は無視されます。

  1. Contains - Observable が特定の値を発行するかどうかを決定します

  2. DefaultIfEmpty - 元の Observable から値を発行します。元の Observable が値を発行しない場合は、デフォルト値を発行します

  3. SequenceEqual - 2 つを決定します。 Observable が同じデータ シーケンスを発行するかどうか

  4. SkipUntil - SkipUntil は元の Observable をサブスクライブしますが、2 番目の Observable がデータ項目を発行し、元の Observable の発行を開始するまで、そのエミッターを無視します。

  5. Skipwhile - Skipwhile は元の Observable をサブスクライブしますが、指定した条件が false になる瞬間まで、元の Observable の発行を開始するまでそのエミッターを無視します。

  6. TakeUntil - 2 番目の Observable の代わりに述語関数を使用して、データの送信を終了する必要があるかどうかを判断します。

  7. Take While - Take While は、指定した特定の条件が満たされなくなるまで元の Observable を発行し、その後、元の Observable の発行を停止し、独自の Observable を終了します。

  8. 1.all
  9. Observable が発行するすべてのデータが特定の条件を満たしているかどうかを判断します。元の Observable 内のデータが条件を満たしていない場合、False が返されます。

  10. グループの生徒情報がある場合は、データは次のとおりです:
  11. private ArrayList<Student> initStudents() {
        ArrayList<Student> persons = new ArrayList<>();
        persons.add(new Student("张三", 16));
        persons.add(new Student("李四", 21));
        persons.add(new Student("王二麻子", 18));
        return persons;
    }
    ログイン後にコピー

    学校に入学する場合、学習できるのは20歳以下である必要があります。このように、all関数を使用して判断できます。

    Observable<Student> observable = Observable.from(initStudents());
    Observable<Boolean> booleanObservable = 
                    observable.all(new Func1<Student, Boolean>() {
                        //设置判断规则
                        @Override
                        public Boolean call(Student student) {
                            return student.age<20;
                        }
                    });
    booleanObservable.subscribe(new Action1<Boolean>() {
        @Override
        public void call(Boolean aBoolean) {
            //这里打印了false  因为学生里面李四21岁
            Log.i(TAG, "call: "+aBoolean);
        }
    });
    ログイン後にコピー
  12. 2.Amb

2 つ以上の Observable が指定された場合、Amb は最初にデータまたは通知を発行する Observable のすべてのデータのみを発行し、他のすべての Observable の発行を無視して破棄します。

Observable<String> o1 = Observable.just("a", "b", "c");
Observable<String> o2 = Observable.just("d", "f", "e");

//判断上面的2个被观察者对象哪个先发送数据 发送数据慢的被观察者将被忽略
Observable<String> observable = Observable.amb(o2,o1);

observable.subscribe(new Action1<String>() {
    @Override
    public void call(String s) {
        Log.i(TAG, "call: "+s);
    }
});
ログイン後にコピー

3.Contains

指定された値を Contains に渡します。元の Observable がその値を出力する場合、それが返す Observable は true を出力し、それ以外の場合は false を出力します。

Observable<String> o1 = Observable.just("a", "b", "c");
Observable<Boolean> observable = o1.contains("a");

observable.subscribe(new Action1<Boolean>() {
    @Override
    public void call(Boolean aBoolean) {
        //true
        Log.i(TAG, "call: "+aBoolean);
    }
}
ログイン後にコピー

4.DefaultIfEmpty

DefaultIfEmpty は、元の Observable の値を正確に出力するだけです。元の Observable がデータを出力せずに (onCompletedd の形式で) 正常に終了した場合、DefaultIfEmpty によって返される Observable は、指定したデフォルト値を出力します。 。

Observable<String> o1 = Observable
        .create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                //这里没有发送任何onNext事件,而是调用onCompleted()事件
                subscriber.onCompleted();
            }
        });
    //如果上面的o1不发送任何onNext而结束 则发送一个默认的值d
    Observable<String> o2 = o1.defaultIfEmpty("d");
    o2.subscribe(new Action1<String>() {
        @Override
        public void call(String s) {
            //打印d
            Log.i(TAG, "call: "+s);
        }
    });
ログイン後にコピー

たとえば、オブザーバーがネットワーク リクエストにアクセスすると、バックグラウンド サーバーは戻りデータを返さないため、代わりにデフォルト データを使用できます。

5.SequenceEqual

は、2つのObservableが同じデータシーケンスを出力するかどうかを決定し、2つのObservableの出力を比較します(同じデータ、同じ順序、同じ終了ステータス)。それ以外の場合は false を出力します。

Observable<Integer> o1 = Observable.just(1,2,3);
Observable<Integer> o2 = Observable.just(1,2,3);
Observable<Boolean> observable = Observable.sequenceEqual(o1, o2);

observable.subscribe(new Action1<Boolean>() {
    @Override
    public void call(Boolean aBoolean) {
        Log.i(TAG, "call: "+aBoolean);
    }
});
ログイン後にコピー

6.1 SkipUntil

SkipUntil は、元の Observable をサブスクライブしますが、2 番目の Observable がアイテムを放出し、元の Observable の放出を開始するまで、そのエミッターを無視します。

Observable<Integer> o1 = Observable.just(1,2,3);
Observable<Integer> o2 = o1.skipUntil(Observable.create(new Observable.OnSubscribe<Integer>() {
    @Override
    public void call(Subscriber<? super Integer> subscriber) {
        //如果不发送如下信息  则上面的1,2,3都不会发送
        //如果发送了4 则直接发送1,2,3 但是4 5并没有发送
        subscriber.onNext(4);
        subscriber.onNext(5);
    }
}));

o2.subscribe(new Action1<Integer>() {
    @Override
    public void call(Integer value) {
        Log.i(TAG, "call: "+value);
    }
});
ログイン後にコピー
出力:

call: 1
call: 2
call: 3
ログイン後にコピー

6.2 SkipUntil

Skipwhile は、元の Observable をサブスクライブしますが、指定した条件の 1 つが false になる瞬間まで、元の Observable の発行を開始するまで、そのエミッターを無視します。

Observable<Integer> o1 = Observable.just(1,2,3,4,5,6);
Observable<Integer> o2 = o1.skipWhile(new Func1<Integer, Boolean>() {
    @Override
    public Boolean call(Integer value) {
        //直到发送的数据"等于"4 才开始从4发送数据 这里打印4,5,6
        return value!=4;
    }
});

o2.subscribe(new Action1<Integer>() {
    @Override
    public void call(Integer value) {
        Log.i(TAG, "call: "+value);
    }
});
ログイン後にコピー

出力:

call: 4
call: 5
call: 6
ログイン後にコピー

7.1 TakeUntil

takeUntil内の関数を使用して、後続のデータを終了して送信を続けるかどうかを決定します。コードは次のとおりです:

Observable<Integer> o1 = Observable.just(1,2,3,4,5,6);
Observable<Integer> o2 = o1.takeUntil(new Func1<Integer, Boolean>() {
    @Override
    public Boolean call(Integer value) {
        //发送数据直到等于4才停止发送
        return value==4;
    }
});

o2.subscribe(new Action1<Integer>() {
    @Override
    public void call(Integer value) {
        Log.i(TAG, "call: "+value);
    }
});
ログイン後にコピー

上記のコードは次のようなものです:

ArrayList<Integer> datas=new ArrayList<>();
for (int i = 1; i <= 6 ; i++) {
    datas.add(i);
}
int index=0;
while(datas.get(index)<=4){
    Log.i(TAG, "onCreate: "+datas.get(index));
    index++;
}
ログイン後にコピー

7.2 Takewhile

Take While は、指定した特定の条件が満たされなくなるまで元の Observable を発行し、その後、元の Observable の発行を停止し、独自の Observable を終了します。 。

Observable<Integer> o1 = Observable.just(1,2,3,4,5,6);
Observable<Integer> o2 = o1.takeWhile(new Func1<Integer, Boolean>() {
    @Override
    public Boolean call(Integer integer) {
        //发送数据 直到发送的数据等于才停止发送
        return integer!=5;
    }
});

o2.subscribe(new Action1<Integer>() {
    @Override
    public void call(Integer value) {
        Log.i(TAG, "call: "+value);
    }
});
ログイン後にコピー

上記のコードは、次の while ステートメントと同様に 1 ~ 4 を出力します:

ArrayList<Integer> datas=new ArrayList<>();
for (int i = 1; i <= 6 ; i++) {
    datas.add(i);
}
int index=0;
while(datas.get(index)!=5){
    Log.i(TAG, "onCreate: "+datas.get(index));
    index++;
}
ログイン後にコピー

以下に示す関数は、複数の Observable を結合するために使用できます。

Merge - 複数の Observable の放出を時間差でマージします

StartWith - データシーケンスの先頭に指定された項目を挿入します

    Zip - によって提供されるルールに従って 2 つの Observable の放出データをマージします関数、データの送信 合計数は、送信されるオブザーバブルの最小数に基づきます。
  1. 8.Merge
  2. 複数のObservableの放出をマージします。 Merge オペレーターを使用すると、複数の Observable の出力を単一の Observable であるかのようにマージできます。

  3. Merge により、マージされた Observable によって放出されるデータがインターリーブされる可能性があります (データをインターリーブしない同様の演算子 Concat があり、複数の Observable の放出を順番に次々に放出します)。
  4. サンプルコード

    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.");
            }
        });
    ログイン後にコピー
  5. Output
Next: 1
Next: 3
Next: 5
Next: 2
Next: 4
Next: 6
Sequence complete.
ログイン後にコピー

9.StartWith

データシーケンスの先頭に指定された項目を挿入します

Observableがデータを発行する前に指定されたデータシーケンスを発行したい場合は、StartWithメソッドを使用できます演算子。 (Observable によって出力されたデータの末尾にデータ シーケンスを追加したい場合は、Concat オペレーターを使用できます。)

Observable<String> o1 = Observable.just("模拟网络请求");
Observable<String> o2 = o1.startWith("网络请求之前的准备工作");
o2.subscribe(new Action1<String>() {
    @Override
    public void call(String value) {
        Log.i(TAG, value);
    }
});
ログイン後にコピー

输出:

网络请求之前的准备工作
模拟网络请求
ログイン後にコピー

类似的函数有:

  • Javadoc: startWith(Iterable))

  • Javadoc: startWith(T)) (最多接受九个参数)

  • Javadoc: startWith(Observable))

10.Zip

假设被观察者o1发送的数据为1 2 ,被观察者o2发送的数据为3,4,5。那么zip压缩发送的数据个数以最低个也就是2个为准。并且 新发送的每个数据以Func2的返回数据为准。

  • Javadoc: zip(Observable1,Observable2,Func2));

示例代码如下:

Observable<Integer> o1 = Observable.just(1,2);
Observable<Integer> o2 = Observable.just(3,4,5);

Observable<Integer> zipObservable = Observable
        .zip(o1, o2, new Func2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer o, Integer o2) {
                return o + o2;
            }
        });

zipObservable.subscribe(new Action1<Integer>() {
    @Override
    public void call(Integer s) {
        Log.i(TAG, "call: "+s);
    }
});
ログイン後にコピー

输出如下:

call: 4 // 1+3
call: 6   // 2+4
ログイン後にコピー


 以上就是深入浅出RxJava_06[传输过程的条件&组合操作]的详情的内容,更多相关内容请关注PHP中文网(www.php.cn)!


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート