目次
2 つ以上の Observable が指定された場合、Amb は最初にデータまたは通知を発行する Observable のすべてのデータのみを発行し、他のすべての Observable の発行を無視して破棄します。
DefaultIfEmpty は、元の Observable の値を正確に出力するだけです。元の Observable がデータを出力せずに (onCompletedd の形式で) 正常に終了した場合、DefaultIfEmpty によって返される Observable は、指定したデフォルト値を出力します。 。
は、2つのObservableが同じデータシーケンスを出力するかどうかを決定し、2つのObservableの出力を比較します(同じデータ、同じ順序、同じ終了ステータス)。それ以外の場合は false を出力します。
6.2 SkipUntil
出力:
上記のコードは次のようなものです:
上記のコードは、次の while ステートメントと同様に 1 ~ 4 を出力します:
9.StartWith
10.Zip
ホームページ Java &#&チュートリアル RxJava_06の詳細を徹底解説【送信処理の条件と組み合わせ動作】

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

Mar 04, 2017 am 09:58 AM


このチュートリアルは 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)!


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか? Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか? Mar 17, 2025 pm 05:35 PM

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します

カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか? カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか? Mar 17, 2025 pm 05:44 PM

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか? キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか? Mar 17, 2025 pm 05:43 PM

この記事では、キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPAを使用することについて説明します。潜在的な落とし穴を強調しながら、パフォーマンスを最適化するためのセットアップ、エンティティマッピング、およびベストプラクティスをカバーしています。[159文字]

高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか? 高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか? Mar 17, 2025 pm 05:46 PM

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

適切なバージョン化と依存関係管理を備えたカスタムJavaライブラリ(JARファイル)を作成および使用するにはどうすればよいですか? 適切なバージョン化と依存関係管理を備えたカスタムJavaライブラリ(JARファイル)を作成および使用するにはどうすればよいですか? Mar 17, 2025 pm 05:45 PM

この記事では、MavenやGradleなどのツールを使用して、適切なバージョン化と依存関係管理を使用して、カスタムJavaライブラリ(JARファイル)の作成と使用について説明します。

See all articles