机票直达
Kotlin 协程之 Flow 详解一 冷流的生产和消费
Kotlin 协程之 Flow 详解二 常用操作符
Kotlin 协程之 Flow 详解三 还是常用操作符
概述
Flow类似RxJava,当然也有许多操作符,不过Flow的操作符学习要比RxJava的操作符简单直白一些,本人感觉更喜欢Flow一些,本文将介绍一部分中间操作符的使用(转换、过滤)
转换操作符(属于中间操作符)
- map(常用)
将发出的值进行转换 ,Lambda的返回值为转换后发送的值
flow {
emit(1)
}.map {
"it is $it"
}.collect {
println(it)
}
- mapNotNull(常用)
仅发送 map后不为空的值
flow {
emit(1)
emit(null)
emit(2)
emit(2)
emit(3)
}.filterNotNull().collect { //null 将被丢弃
println(it)
}
- mapLatest
当有新值发送时,如果上个转换还没结束,会先取消掉,用法同map
flow {
emit(1)
delay(100L)
emit(2)
delay(100L)
emit(3)
delay(100L)
emit(5)
}.mapLatest{ //将只会转换最后一个值
delay(500L)
"it is $it"
}.collect {
println(it)
}
过滤操作符(属于中间操作符)
- filter(常用)
筛选符合条件的值(不符合条件的值将被丢弃)
flow {
emit(1)
emit(2)
emit(3)
emit(4)
emit(5)
}.filter{
it > 1 // 大于1的值将会继续发送,其他值将被丢弃
}.collect {
println(it)
}
- filterNot(符合条件的值将被丢弃)(常用)
筛选不符合条件的值,相当于filter取反
flow {
emit(1)
emit(2)
emit(3)
emit(4)
emit(5)
}.filterNot{
it > 1 // 大于1的值将被丢弃
}.collect {
println(it)
}
- filterInstance(常用)
筛选符合类型的值(不符合类型的值将被丢弃)
flow {
emit(1)
emit("2")
emit("3")
}.filterIsInstance<String>().collect { // String类型继续发送,其他值将被丢弃
println(it)
}
- filterNotNull(常用)
筛选不为空的值(null将被丢弃)
flow {
emit("1")
emit(null)
emit(2)
}.filterNotNull().collect {
println(it)
}
- drop(常用)
作用是丢弃掉前 n 个的值,n为传入的Int类型参数
flow {
emit(1)
emit(2)
emit(3)
emit(4)
emit(5)
}.drop(2).collect { // 前面2个值将被丢弃
println(it)
}
- dropWhile(常用)
找到第一个不满足条件的值,继续发送它和它之后的值
flow {
emit(0)
emit(1) //从此项开始不满足条件
emit(2)
emit(3)
}. dropWhile { it < 1 } .collect { //0将被丢弃
println(it)
}
- take(常用)
返回前 n个 元素,和drop相反,不再示例
- takeWhile(常用)
找到第一个不满足条件的值,发送它之前的值,和dropWhile相反,不再示例
- debounce(常用)
指定时间内发送的只保留最后一个,其他将被丢弃,防抖用的
flow {
emit(1)
delay(100)
emit(2)
delay(100)
emit(3)
delay(1111)
emit(4)
delay(1111)
emit(5)
}.debounce(1000).collect { //1、2、3将被丢弃
println(it)
}
- sample(常用)
固定周期采样 ,给定一个时间周期,保留周期内最后发出的值,其他的值将被丢弃
flow {
repeat(50) {
delay(50)
emit(it)
}
}.sample(100).collect {
println(it)
}
- distinctUntilChangedBy(常用)
去重操作符,给定判断条件视为重复的值值保留第一个,其他将被丢弃
flowOf(
Stu(name = "Jack", age = 11),
Stu(name = "Tom", age = 10),
Stu(name = "Jack", age = 12)
).distinctUntilChangedBy { it.name } .collect { //第三个Stu将被丢弃
println(it.toString())
}
- distinctUntilChanged(常用)
去重操作符,distinctUntilChangedBy的简化版,相同的值将被丢弃
flowOf(0, 1, 1, 1, 2, 3).distinctUntilChanged().collect { // 结果是 0 1 2 3
println(it)
}
网友评论