Kotlin Flow 转换以及上下游处理

本片文章主要介绍Flow上下游处理,上游一个Flow使用map,上游两个Flow使用zip,上游三个Flow及以上使用combine

1、下面代码展示了upStreamFlow作为上游,downStreamFlow作为下游,通过对upStreamFlow使用map操作符函数将upStreamFlow转换为新的Flow对象,每个元素都通过lambda表达式进行处理,并生成以"Number:"为开头的字符串。

Kotlin 复制代码
package com.cqz

import kotlinx.coroutines.flow.*

suspend fun main() {
    val upStreamFlow: Flow<Int> = flow {
        for (i in 1..5) {
            emit(i)
        }
    }
    val downStreamFlow: Flow<String> = upStreamFlow.map {
        "Number:$it"
    }
    upStreamFlow.collect {
        println("upStreamFlow:$it")
    }
    downStreamFlow.collect {
        println("downStreamFlow:$it")
    }

}

运行以上代码将会得到以下结果

Kotlin 复制代码
upStreamFlow:1
upStreamFlow:2
upStreamFlow:3
upStreamFlow:4
upStreamFlow:5
downStreamFlow:Number:1
downStreamFlow:Number:2
downStreamFlow:Number:3
downStreamFlow:Number:4
downStreamFlow:Number:5

2、上游两个Flow可以使用zip操作符函数将两个Flow合并为新的Flow对象。这个函数接受两个asdFlow作为参数,并通过lambda表达式将它们的元素进行组合。

Kotlin 复制代码
package com.cqz

import kotlinx.coroutines.flow.*

suspend fun main() {
    val upStreamFlow: Flow<Int> = flow {
        for (i in 1..5) {
            emit(i)
        }
    }
    
    val upStream2Flow: Flow<Int> = flow {
        for (i in 6..10) {
            emit(i)
        }
    }
    upStreamFlow.zip(upStream2Flow) { num1,num2->
        num1 + num2
    }.collect {
        println("zip:$it")
    }
   
}

运行以上代码将会得到以下结果

Kotlin 复制代码
zip:7
zip:9
zip:11
zip:13
zip:15

3、上游有三个Flow或以上的时候可以使用combine操作符函数,将三个Flow合并为一个Flow

Kotlin 复制代码
package com.cqz

import kotlinx.coroutines.flow.*

suspend fun main() {

    val flow1 = flowOf(1,2,3)
    val flow2 = flowOf(false,true,false)
    val flow3 = flowOf("A","B","C")
   val combinedFlow = combine(flow1,flow2,flow3) {i, b, s ->
       CombinedResult(i,b,s)
   }
   combinedFlow.collect {
       println("combinedFlow:$it")
   }
}
data class CombinedResult(val i: Int,val b: Boolean,val str: String)

运行以上代码将会得到以下结果

Kotlin 复制代码
combinedFlow:CombinedResult(i=1, b=false, str=A)
combinedFlow:CombinedResult(i=2, b=false, str=A)
combinedFlow:CombinedResult(i=2, b=true, str=A)
combinedFlow:CombinedResult(i=2, b=true, str=B)
combinedFlow:CombinedResult(i=3, b=true, str=B)
combinedFlow:CombinedResult(i=3, b=false, str=B)
combinedFlow:CombinedResult(i=3, b=false, str=C)
相关推荐
LV技术派12 分钟前
【成为 AI Native Builder · 02】什么是 AI Native Builder:一个人 + AI,交付完整闭环
前端·程序员·ai编程
长不大的杨瑞杰30 分钟前
OpenCode v2 LSP 实战:内置语言服务器、自定义配置与诊断闭环
java·人工智能·typescript·lsp·opencode
#麻辣小龙虾#32 分钟前
网页布局css中flex+margin的组合布局技巧
开发语言·前端·javascript
云和数据.ChenGuang35 分钟前
python和java的try
java·开发语言·python
我是唐青枫35 分钟前
Kotlin Inheritance(继承)详解:语法、原理、实战 Demo
开发语言·kotlin
叼烟扛炮35 分钟前
Linux 学习笔记(四十五):Web 安全基石——Cookie、Session 与 HTTPS 原理解析
linux·前端·网络·笔记·学习·tcp/ip·安全
日日大王学编程36 分钟前
阿里巴巴开源 Data Agent(Text2SQL)项目全维度详解
java·ai·开源
Wang's Blog40 分钟前
Java 项目实战:交友项目 - 交友左滑右滑
java·交友
环境栈笔记42 分钟前
指纹浏览器安卓怎么用?从运行位置到功能验收,先把三种方案分清
前端·人工智能·后端·自动化
测试盐42 分钟前
spark作业日志定位过程
java·hadoop·spark