美文网首页Android Kotlin
Kotlin 协程之 Flow 详解二 常用操作符

Kotlin 协程之 Flow 详解二 常用操作符

作者: Kael_Zhang的安卓笔记 | 来源:发表于2022-09-19 11:29 被阅读0次

机票直达

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)
                }

相关文章

网友评论

    本文标题:Kotlin 协程之 Flow 详解二 常用操作符

    本文链接:https://www.haomeiwen.com/subject/zivjortx.html