Android主流框架——Rxjava (操作符与使用)

创建型操作符

package com.example.rxjavapractice.operators

import io.reactivex.Observable
import io.reactivex.Observer
import io.reactivex.disposables.Disposable
import io.reactivex.functions.Consumer

fun just() {
    // TODO 无需自己发射,创建即发射
    Observable.just("A", "B")
        .subscribe(object : Observer<String> {
            override fun onNext(t: String) {
                TODO("Not yet implemented")
            }

            override fun onSubscribe(d: Disposable) {
                TODO("Not yet implemented")
            }

            override fun onError(e: Throwable) {
                TODO("Not yet implemented")
            }

            override fun onComplete() {
                TODO("Not yet implemented")
            }
        })
}

fun empty() {
    // TODO 上游不发送任何事件,范型填Any,只会发射onComplete
    // TODO 进行耗时操作,不需要任何数据刷新UI,就可以用empty
    Observable.empty<Any>()
        .subscribe(object : Observer<Any> {
            override fun onSubscribe(d: Disposable) {
                TODO("Not yet implemented")
            }

            override fun onNext(t: Any) {
                TODO("Not yet implemented")
            }

            override fun onError(e: Throwable) {
                TODO("Not yet implemented")
            }

            override fun onComplete() {
                TODO("Not yet implemented")
            }

        })
}

fun range() {
    // TODO 从80开始,每次+1,发射8次,自动发射事件
    Observable.range(80, 8)
        .subscribe(object : Consumer<Int> {
            override fun accept(t: Int?) {
                TODO("Not yet implemented")
            }
        })
}

过滤型操作符

package com.example.rxjavapractice.operators

import io.reactivex.Observable
import io.reactivex.functions.Predicate
import java.util.concurrent.TimeUnit

fun filter() {
    // TODO 在上下游之间插入一个过滤器,返回为true即发射事件
    Observable.just(1, 2, 3)
        .filter(object : Predicate<Int> {
            override fun test(t: Int): Boolean {
                return t >= 2
            }
        })
}

fun take() {
    // TODO 限定事件源发射的事件次数
    Observable.interval(1, TimeUnit.SECONDS)
        .take(8)
}

fun distinct(){
    // TODO 过滤重复发射的事件
    Observable.just(1,1,2,
        2,3,3,4)
        .distinct()
}

fun elementAt(){
    // TODO 过滤制定事件的下标
    Observable.just(1,1,2,
        2,3,3,4)
        .elementAt(2)
}

合并型操作符

package com.example.rxjavapractice.operators

import io.reactivex.Observable
import io.reactivex.functions.Function3
import java.util.concurrent.TimeUnit

fun startWith() {
    // TODO 倒叙发射事件源
    Observable.just(1, 2, 3) // 3
        .startWith(Observable.just(100, 200, 300)) // 2
        .startWith(Observable.just(4, 5, 6)) // 1
}

fun concatWith() {
    // TODO 顺序发射事件源
    Observable.just(1, 2, 3) // 1
        .concatWith(Observable.just(100, 200, 300)) // 2
        .concatWith(Observable.just(4, 5, 6)) // 3
}

fun concat() {
    // TODO concat可以把最多4个事件源进行连接,顺序进行,实质上是把四个数据源合成了一个,串行发射数据
    Observable.concat(
        Observable.just(1),
        Observable.just(2),
        Observable.just(3),
        Observable.just(4, 5, 6, 7)
    )
}

fun merge() {
    // TODO start:开始累计;count:累计数量;initialDelay:初始时延;period:事件间隔时间
    Observable.intervalRange(1, 5, 1, 1, TimeUnit.SECONDS)

    // TODO merge将最多四个数据源合并成一个数据源,各个子数据源并行发射数据
    Observable.merge(
        Observable.intervalRange(1, 5, 1, 1, TimeUnit.SECONDS),
        Observable.intervalRange(6, 5, 1, 1, TimeUnit.SECONDS),
        Observable.intervalRange(11, 5, 1, 1, TimeUnit.SECONDS),
        Observable.intervalRange(16, 5, 1, 1, TimeUnit.SECONDS)
    )
}

fun zip() {
    val observable1 = Observable.just(1, 2, 3)
    val observable2 = Observable.just("1", "2", "3")
    val observable3 = Observable.just(1.0, 2.0, 3.0)

    // TODO,把几个数据源的数据合并成一个数据源,且发送的事件也进行合并
    Observable.zip(
        observable1,
        observable2,
        observable3,
        object : Function3<Int, String, Double, String> {
            override fun apply(t1: Int, t2: String, t3: Double): String {
                return ""
            }
        })
}

转换型操作符

package com.example.rxjavapractice.operators

import android.util.Log
import io.reactivex.Observable
import io.reactivex.ObservableEmitter
import io.reactivex.ObservableOnSubscribe
import io.reactivex.ObservableSource
import io.reactivex.functions.Consumer
import io.reactivex.functions.Function
import io.reactivex.observables.GroupedObservable
import java.util.concurrent.TimeUnit

const val TAG = "TranslateOperators"

fun map() {
    // TODO 上游Int -> map(Int, String) -> 下游String
    Observable.just(1)
        .map(object : Function<Int, String> {
            override fun apply(t: Int): String {
                return t.toString()
            }
        })
        .map(object : Function<String, Int> {
            override fun apply(t: String): Int {
                return t.toInt()
            }
        })
}

fun flatMap1() {
    // TODO 将每次事件变成一个事件源,事件源可再次向下游发送事件
    Observable.just(1, 2, 3)
        .flatMap(object : Function<Int, ObservableSource<String>> {

            override fun apply(t: Int): ObservableSource<String> {
                // TODO 返回一个事件源,ObservableSource是Observable的父类,可再次发射事件
                return Observable.create(object : ObservableOnSubscribe<String> {
                    override fun subscribe(emitter: ObservableEmitter<String>) {
                        emitter.onNext("flatMap: $t")
                        emitter.onNext("flatMap: $t")
                        emitter.onNext("flatMap: $t")
                    }
                })
            }

        })
}

fun flatMap2() {
    // TODO flatMap是不排序的
    Observable.create(object : ObservableOnSubscribe<Int> {
        override fun subscribe(emitter: ObservableEmitter<Int>) {
            emitter.onNext(3)
            emitter.onNext(2)
            emitter.onNext(1)
        }
    }).flatMap {
        val list = mutableListOf<String>("11", "22", "33")
        Observable.fromIterable(list)
            .delay(it.toLong(), TimeUnit.SECONDS)
    }
}

fun concatMap() {
    // TODO concatMap是排序的
    Observable.create(object : ObservableOnSubscribe<Int> {
        override fun subscribe(emitter: ObservableEmitter<Int>) {
            emitter.onNext(3)
            emitter.onNext(2)
            emitter.onNext(1)
        }
    }).concatMap {
        val list = mutableListOf<String>("11", "22", "33")
        Observable.fromIterable(list)
            .delay(it.toLong(), TimeUnit.SECONDS)
    }
}

fun groupBy() {
    // TODO 可以对一级事件源进行分组,每组都是二级事件源
    Observable.just(1, 2, 3, 4, 5)
        .groupBy(object : Function<Int, String> {
            override fun apply(t: Int): String {
                return if (t > 3) "高分组" else "低分组"
            }
        })
        .subscribe(object : Consumer<GroupedObservable<String, Int>> {
            // TODO 这一层是分组,t作为事件源,可以向下游发射组内元素
            override fun accept(t: GroupedObservable<String, Int>?) {
                Log.d(TAG, "groupBy分组名: ${t?.key}")
                // TODO 这一层才是组内元素
                t?.subscribe {
                    Log.d(TAG, "组内元素:${it}")
                }
            }
        })
}

 

posted on 2021-01-31 20:07  zsben  阅读(459)  评论(0编辑  收藏  举报

导航