美文网首页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