Kotlin Flow 常用操作符

摘抄自 Kotlin 语言官网文档,为的是列出相关操作符,方便自己后期查看
点我跳转 Kotlin 官网文档 Flow

Flow 是什么?

挂起函数可以异步的返回单个值,但是该如何异步返回多个计算好的值呢?这正是 Kotlin 流(Flow)的用武之地。

创建Flow

构建中,不允许 withContext 修改上下文

flow{}

fun simple(): Flow<Int> = flow {
    // 流构建器
    for (i in 1..3) {
   
        delay(100) // 假装我们在这里做了一些有用的事情
        emit(i) // 发送下一个值
    }
}

flowOf(1,2,3)

.asFlow()

集合与序列转换为流

emit

发射值。

collect

收集值,构造器内的代码,直到被收集的时候才会运行。

simple().collect{
    it-> println(it) }

打印:
1
2
3

取消

withTimeoutOrNull(250)

250毫秒后超时自动取消。

withTimeoutOrNull(250) {
    // 在 250 毫秒后超时
    simple().collect {
    value -> println(value) } 
}
println("Done")

转换

map

转换成我们想要的数据。

fun main() = runBlocking<Unit> {
   
    (1..3).asFlow() // 一个请求流
        .map {
    "number: $it" }
        .collect {
    response -> println(response) }
}

打印:
number: 1
number: 2
number: 3

transform

可以发射任意值任意次。

fun main() = runBlocking<Unit> {
   
    (1..3).asFlow() // 一个请求流
        .transform {
    request ->
            emit("Making request $request") 
            emit(performRequest(request)) 
        }
        .collect {
    response -> println(response) }
}

限长操作符

take

在流触及相应限制的时候将它的执行取消

fun numbers(): Flow<Int> = flow {
   
    try {
                             
        emit(1)
        emit(2) 
        println("This line will not execute")
        emit(3)    
        emit(4) 
    } finally {
   
        println("Finally in numbers")
    }
}

fun main() = runBlocking<Unit> {
   
    numbers() 
        .take(2) // 只获取前两个
        .collect {
    value -> println(value) }
}     

打印:
1
2
This line will not execute
3
Finally in numbers

末端操作符

toList、toSet

转换为需要的集合

first、single、fold

后续再试验

reduce

将流规约到单个值

fun main() = runBlocking<Unit> {
   

    val sum = (1..5).asFlow()
        .map {
    it * it } // 数字 1 至 5 的平方                        
        .reduce {
    a, b -> a + b } // 求和(末端操作符)
    println(sum)     
}

launchIn

使用 launchIn 替换 collect 我们可以在单独的协程中启动流的收集,这样就可以立即继续进一步执行代码。

// 模仿事件流
fun events(): Flow<Int> = (1..3).asFlow().onEach {
    delay(100)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值