Heim > Artikel > Backend-Entwicklung > RxJava操作符(二)Transforming Observables_PHP教程
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>private Observable<List<Integer>> bufferObserver() {<br /></li><li>return Observable.just(1, 2, 3, 4, 5, 6, 7, 8, 9).buffer(2, 3);<br /></li><li>}<br /></li><li><br /></li><li>private Observable<List<Long>> bufferTimeObserver() {<br /></li><li>return Observable.interval(1, TimeUnit.SECONDS).buffer(3, TimeUnit.SECONDS).observeOn(AndroidSchedulers.mainThread());<br /></li><li>}</li></ol>对其进行订阅
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>mLButton.setText("buffer");<br /></li><li>mLButton.setOnClickListener(e -> bufferObserver().subscribe(i -> log("buffer:" + i)));<br /></li><li>mRButton.setText("bufferTime");<br /></li><li>mRButton.setOnClickListener(e -> bufferTimeObserver().subscribe(i -> log("bufferTime:" + i)));</li></ol>
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>private Observable<String> flatMapObserver() {<br /></li><li>return Observable.just(1, 2, 3, 4, 5, 6, 7, 8, 9).flatMap(integer -> Observable.just("flat map:" + integer));<br /></li><li>}<br /></li><li><br /></li><li>private Observable<? extends Integer> flatMapIterableObserver() {<br /></li><li>return Observable.just(1, 2, 3, 4, 5, 6, 7, 8, 9)<br /></li><li>.flatMapIterable(<br /></li><li>integer -> {<br /></li><li>ArrayList<Integer> s = new ArrayList<>();<br /></li><li>for (int i = 0; i < integer; i++) {<br /></li><li>s.add(integer);<br /></li><li>}<br /></li><li>return s;<br /></li><li>}<br /></li><li>);<br /></li><li>}</li></ol>分别对其进行订阅
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>mLButton.setText("flatMap");<br /></li><li>mLButton.setOnClickListener(e -> flatMapObserver().subscribe(i -> log(i)));<br /></li><li>mRButton.setText("flatMapIterable");<br /></li><li>mRButton.setOnClickListener(e -> flatMapIterableObserver().subscribe(i -> log("flatMapIterable:" + i)));</li></ol>
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>mLButton.setText("groupBy");<br /></li><li>mLButton.setOnClickListener(e -> groupByObserver().subscribe(new Subscriber<GroupedObservable<Integer, Integer>>() {<br /></li><li>@Override<br /></li><li>public void onCompleted() {<br /></li><li><br /></li><li>}<br /></li><li><br /></li><li>@Override<br /></li><li>public void onError(Throwable e) {<br /></li><li><br /></li><li>}<br /></li><li><br /></li><li>@Override<br /></li><li>public void onNext(GroupedObservable<Integer, Integer> groupedObservable) {<br /></li><li>groupedObservable.count().subscribe(integer -> log("key" + groupedObservable.getKey() + " contains:" + integer + " numbers"));<br /></li><li>}<br /></li><li>}));<br /></li><li>mRButton.setText("groupByKeyValue");<br /></li><li>mRButton.setOnClickListener(e -> groupByKeyValueObserver().subscribe(new Subscriber<GroupedObservable<Integer, String>>() {<br /></li><li>@Override<br /></li><li>public void onCompleted() {<br /></li><li><br /></li><li>}<br /></li><li><br /></li><li>@Override<br /></li><li>public void onError(Throwable e) {<br /></li><li><br /></li><li>}<br /></li><li><br /></li><li>@Override<br /></li><li>public void onNext(GroupedObservable<Integer, String> integerIntegerGroupedObservable) {<br /></li><li>if (integerIntegerGroupedObservable.getKey() == 0) {<br /></li><li>integerIntegerGroupedObservable.subscribe(integer -> log(integer));<br /></li><li>}<br /></li><li>}<br /></li><li>}));<br /></li><li>}</li></ol>
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>private Observable<Integer> mapObserver() {<br /></li><li>return Observable.just(1, 2, 3, 4, 5, 6, 7, 8, 9).map(integer -> integer * 10);<br /></li><li>}<br /></li><li><br /></li><li>private Observable<Dog> castObserver() {<br /></li><li>return Observable.just(getAnimal())<br /></li><li>.cast(Dog.class);<br /></li><li>}<br /></li><li><br /></li><li>Animal getAnimal() {<br /></li><li>return new Dog();<br /></li><li>}<br /></li><li><br /></li><li>class Animal {<br /></li><li>protected String name = "Animal";<br /></li><li><br /></li><li>Animal() {<br /></li><li>log("create " + name);<br /></li><li>}<br /></li><li><br /></li><li>String getName() {<br /></li><li>return name;<br /></li><li>}<br /></li><li>}<br /></li><li><br /></li><li>class Dog extends Animal {<br /></li><li>Dog() {<br /></li><li>name = getClass().getSimpleName();<br /></li><li>log("create " + name);<br /></li><li>}<br /></li><li><br /></li><li>}</li></ol>对其进行注册
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>mLButton.setText("Map");<br /></li><li>mLButton.setOnClickListener(e -> mapObserver().subscribe(i -> log("Map:" + i)));<br /></li><li>mRButton.setText("Cast");<br /></li><li>mRButton.setOnClickListener(e -> castObserver().subscribe(i -> log("Cast:" + i.getName())));</li></ol>运行后得到结果如下。可以看到,map操作符将数据都乘以10后再发射出来,cast操作符将Animal类型的对象强制转化为Dog类型的对象。另外我们还可以验证一下一个知识点,有继承的情况下创建对象会首先调用父类的构造方法哦。
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>private Observable<Integer> scanObserver() {<br /></li><li>return Observable.from(list).scan((x, y) -> x * y).observeOn(AndroidSchedulers.mainThread());<br /></li><li>}</li></ol>对其进行订阅
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>mLButton.setText("scan");<br /></li><li>mLButton.setOnClickListener(e -> scanObserver().subscribe(i -> log("scan:" + i)));</li></ol>得到结果如下,可以看到,我们输出了2的n次方。
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>private Observable<Observable<Integer>> windowCountObserver() {<br /></li><li>return Observable.just(1, 2, 3, 4, 5, 6, 7, 8, 9).window(3);<br /></li><li>}<br /></li><li><br /></li><li>private Observable<Observable<Long>> wondowTimeObserver() {<br /></li><li>return Observable.interval(1000, TimeUnit.MILLISECONDS)<br /></li><li>.window(3000, TimeUnit.MILLISECONDS)<br /></li><li>.observeOn(AndroidSchedulers.mainThread());<br /></li><li>}</li></ol>分别对其订阅
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>mLButton.setText("window");<br /></li><li>mLButton.setOnClickListener(e -> windowCountObserver().subscribe(i -> {<br /></li><li>log(i);<br /></li><li>i.subscribe((j -> log("window:" + j)));<br /></li><li>}));<br /></li><li>mRButton.setText("Time");<br /></li><li>mRButton.setOnClickListener(e -> wondowTimeObserver().subscribe(i -> {<br /></li><li>log(i);<br /></li><li>i.observeOn(AndroidSchedulers.mainThread()).subscribe((j -> log("wondowTime:" + j)));<br /></li><li>}));</li></ol>运行结果如下,可以看到第一个Observable对象没次发射出一个包含3个数据的小Observable,第二个Observable对象每隔3秒钟发射出一个包含2~4个数据的Observable对象