ホームページ > バックエンド開発 > PHPチュートリアル > RxJava 演算子 (7) 条件付きおよび Boolean_PHP チュートリアル

RxJava 演算子 (7) 条件付きおよび Boolean_PHP チュートリアル

WBOY
リリース: 2016-07-12 09:03:52
オリジナル
981 人が閲覧しました

RxJava 演算子 (7) 条件演算子とブール演算子

この記事では、条件演算子とブール演算子について学びます。

1. All/Amb
All オペレーターは、ソース Observable が出力するすべてのデータを関数に基づいて判定し、最終的に返される結果が判定結果です。この関数は、出力されたデータをパラメータとして、すべてのデータが定義した判定条件を満たしているかどうかを内部で判定し、すべて満たしている場合は true を返し、そうでない場合は false を返します。

Amb オペレーターは、最大 9 つの Observable を組み合わせて、それらを競争させることができます。最初にデータを発行する Observable (onError および onComplete を含む) は引き続きこの Observable のデータを発行し、他の Observable によって発行されたデータは破棄されません。

これら 2 つの演算子は、初めて使用されたときにタグが false の場合、将来は 5 つの Observable が作成されるように制限を設けています。数字が生まれます。

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>private Observable<Boolean> allObserver() {<br /></li><li>Observable<Integer> just;<br /></li><li>if (tag) {<br /></li><li>just = Observable.just(1, 2, 3, 4, 5);<br /></li><li>} else {<br /></li><li>just = Observable.just(1, 2, 3, 4, 5, 6);<br /></li><li>}<br /></li><li>tag = true;<br /></li><li>return just.all(integer -> integer < 6);<br /></li><li>}<br /></li><li><br /></li><li>private Observable<Integer> ambObserver() {<br /></li><li>Observable<Integer> delay3 = Observable.just(1, 2, 3).delay(3000, TimeUnit.MILLISECONDS);<br /></li><li>Observable<Integer> delay2 = Observable.just(4, 5, 6).delay(2000, TimeUnit.MILLISECONDS);<br /></li><li>Observable<Integer> delay1 = Observable.just(7, 8, 9).delay(1000, TimeUnit.MILLISECONDS);<br /></li><li>return Observable.amb(delay1, delay2, delay3);<br /></li><li>}</li></ol>
ログイン後にコピー


<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>mLButton.setText("all");<br /></li><li>mLButton.setOnClickListener(e -> allObserver().subscribe(i -> log("all:" + i)));<br /></li><li>mRButton.setText("amb");<br /></li><li>mRButton.setOnClickListener(e -> ambObserver().subscribe(i -> log("amb:" + i)));</li></ol>
ログイン後にコピー
を別途購読してください 実行結果は以下の通りです。最初に返された 6 個のデータの Observable は、すべてが 6 未満であるという条件を満たしていないため、結果は false になります。後続のデータはすべて条件を満たすため、結果は true になります。 amb オペレーターの Observable を使用すると、最初に出力されるデータは 7 であるため、7、8、9 が出力され、他のデータは破棄されます。


2. Contains、IsEmpty
Contains 演算子は、ソース Observable によって出力されたデータに特定のデータが含まれているかどうかを判断するために使用されます。発行された場合は false を返します。
IsEmpty 演算子は、ソース Observable がデータを発行したかどうかを判断するために使用されます。データが発行されている場合は、ソース Observable が終了したがデータが発行されていない場合は、true を返します。

これら 2 つの演算子を使用して、2 つの Observable オブジェクトに特定のデータが含まれているかどうか、およびそれらが空であるかどうかを判断します

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>private Observable<Boolean> containsObserver() {<br /></li><li>if (tag) {<br /></li><li>return Observable.just(1, 2, 3).contains(3);<br /></li><li>}<br /></li><li>tag = true;<br /></li><li>return Observable.just(1, 2, 3).contains(4);<br /></li><li>}<br /></li><li><br /></li><li>private Observable<Boolean> defaultObserver() {<br /></li><li>return Observable.create(new Observable.OnSubscribe<Integer>() {<br /></li><li>@Override<br /></li><li>public void call(Subscriber<? super Integer> subscriber) {<br /></li><li>subscriber.onCompleted();<br /></li><li>}<br /></li><li>}).isEmpty();<br /></li><li>}</li></ol>
ログイン後にコピー
個別にサブスクライブします

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>mLButton.setText("contains");<br /></li><li>mLButton.setOnClickListener(e -> containsObserver().subscribe(i -> log("contains:" + i)));<br /></li><li>mRButton.setText("isEmpty");<br /></li><li>mRButton.setOnClickListener(e -> defaultObserver().subscribe(i -> log("isEmpty:" + i)));</li></ol>
ログイン後にコピー
結果は次のとおりです


3. DefaultIfEmpty
空っぽ演算子は、ソース Observable がデータを発行するかどうかを決定します。ソース Observable がデータを発行する場合は、通常どおりデータを発行します。そうでない場合は、デフォルトのデータを発行します

次に、この演算子を使用して空と空でないデータを処理します。 Observable、空の場合はデフォルト値の 10

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>private Observable<Integer> emptyObserver() {<br /></li><li>return Observable.create(new Observable.OnSubscribe<Integer>() {<br /></li><li>@Override<br /></li><li>public void call(Subscriber<? super Integer> subscriber) {<br /></li><li>subscriber.onCompleted();<br /></li><li>}<br /></li><li>}).defaultIfEmpty(10);<br /></li><li>}<br /></li><li><br /></li><li>private Observable<Integer> notEmptyObserver() {<br /></li><li>return Observable.create(new Observable.OnSubscribe<Integer>() {<br /></li><li>@Override<br /></li><li>public void call(Subscriber<? super Integer> subscriber) {<br /></li><li>subscriber.onNext(1);<br /></li><li>subscriber.onCompleted();<br /></li><li>}<br /></li><li>}).defaultIfEmpty(10);<br /></li><li>}</li></ol>
ログイン後にコピー
を返します。 実行結果は次のとおりです

4. SequenceEqual
SequenceEqual 演算子は2 つの Observable が発行するデータ シーケンスが同じ (発行されるデータが同じ、データの順序が同じ、終了ステータスが同じ) 場合は true を返し、それ以外の場合は false を返します

。次に、SequenceEqual を使用して、2 つの同一および異なる Observable をそれぞれ判断します


<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>mLButton.setText("empty");<br /></li><li>mLButton.setOnClickListener(e -> emptyObserver().subscribe(i -> log("empty:" + i)));<br /></li><li>mRButton.setText("notEmpty");<br /></li><li>mRButton.setOnClickListener(e -> notEmptyObserver().subscribe(i -> log("notEmpty:" + i)));</li></ol>
ログイン後にコピー
実行結果は次のとおりです

両方の演算子は、条件に基づいて一部のデータをスキップします。違いは、SkipUnitl が Observable フラグに基づいて判断されることです。Observable フラグがデータを発行しない場合、Observable フラグがデータを発行すると、ソースの Observable によって発行されたデータはすべてスキップされ、データは通常どおり発行されます。 Skip While は、関数に基づいてデータをスキップするかどうかを決定します。関数が true を返す場合、ソース Observable によって出力されるデータはスキップされます。関数が false を返す場合、データは通常どおり出力されます。

いくつかのデータ項目をスキップするには、以下の 2 つの演算子を使用します。


<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>private Observable<Boolean> equalObserver() {<br /></li><li>return Observable.sequenceEqual(Observable.just(1, 2, 3), Observable.just(1, 2, 3));<br /></li><li>}<br /></li><li><br /></li><li>private Observable<Boolean> notEqualObserver() {<br /></li><li>return Observable.sequenceEqual(Observable.just(1, 2, 3), Observable.just(1, 2));<br /></li><li>}</li></ol>
ログイン後にコピー
別途購読

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>mLButton.setText("skipUntil");<br /></li><li>mLButton.setOnClickListener(e -> skipUntilObserver().subscribe(i -> log("skipUntil:" + i)));<br /></li><li>mRButton.setText("skipWhile");<br /></li><li>mRButton.setOnClickListener(e -> skipWhileObserver().subscribe(i -> log("skipWhile:" + i)));</li></ol>
ログイン後にコピー
运行结果如下


六、TakeUntil、TakeWhile
TakeUntil和TakeWhile操作符可以说和SkipUnitl和SkipWhile操作符是完全相反的功能。TakeUntil也是使用一个标志Observable是否发射数据来判断,当标志Observable没有发射数据时,正常发射数据,而一旦标志Observable发射过了数据则后面的数据都会被丢弃。TakeWhile则是根据一个函数来判断是否发射数据,当函数返回值为true的时候正常发射数据;当函数返回false的时候丢弃所有后面的数据。


下面使用这两个操作符来take两个Observable发射的数据

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>private Observable<Long> takeUntilObserver() {<br /></li><li>return Observable.interval(1, TimeUnit.SECONDS).takeUntil(Observable.timer(3, TimeUnit.SECONDS));<br /></li><li>}<br /></li><li><br /></li><li>private Observable<Long> takeWhileObserver() {<br /></li><li>return Observable.interval(1, TimeUnit.SECONDS).takeWhile(aLong -> aLong < 5);<br /></li><li>}</li></ol>
ログイン後にコピー
分别进行订阅

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>mLButton.setText("takeUntil");<br /></li><li>mLButton.setOnClickListener(e -> takeUntilObserver().subscribe(i -> log("takeUntil:" + i)));<br /></li><li>mRButton.setText("takeWhile");<br /></li><li>mRButton.setOnClickListener(e -> takeWhileObserver().subscribe(i -> log("takeWhile:" + i)));</li></ol>
ログイン後にコピー
运行结果如下


关于条件和布尔操作符就到这了,本文中所有的demo程序见:https://github.com/Chaoba/RxJavaDemo

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1077808.htmlTechArticleRxJava操作符(七)Conditional and Boolean 在这篇文章里我们来了解一下条件和布尔操作符。 一、All/Amb All操作符根据一个函数对源Observable发射的...
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート