Kotlin协程Flow流buffer缓冲批量任务或数据,条件筛选任务或数据

Kotlin协程Flow流buffer缓冲批量任务或数据,条件筛选任务或数据

Kotlin 复制代码
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.asFlow
import kotlinx.coroutines.flow.buffer
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.runBlocking

fun main() {
    runBlocking {
        var eachFlag = true
        var collectFlag = true

        (0..50)
            .chunked(5) //切块,分区
            .asFlow()
            .onStart { println("onStart") }
            .onEach { itList ->
                //假设这里是生产者,密集生产数据或任务

                collectFlag = true

                if (eachFlag) {
                    println("--------------------")
                    eachFlag = false
                }

                print("onEach [ ")
                itList.forEach { itData ->
                    print("$itData ")
                }
                print("]")

                println()
            }
            .buffer(capacity = 3, onBufferOverflow = BufferOverflow.SUSPEND)
            .collect { itList ->
                //假设这里是消费者,这里的消费者以一定的耗时完成任务或消费数据

                eachFlag = true

                if (collectFlag) {
                    println("↓")
                    collectFlag = false
                }

                print("collect [ ")
                itList.forEach { itData ->
                    print("$itData ")
                }
                print("]")

                val sortedList = itList.sortedBy { it }
                print(" 最大值=${sortedList.lastOrNull()} 最小值=${sortedList.firstOrNull()}")

                println()
            }
    }
}

输出:

onStart


onEach 0 1 2 3 4

onEach 5 6 7 8 9

onEach 10 11 12 13 14

onEach 15 16 17 18 19

onEach 20 21 22 23 24

collect 0 1 2 3 4 最大值=4 最小值=0

collect 5 6 7 8 9 最大值=9 最小值=5

collect 10 11 12 13 14 最大值=14 最小值=10

collect 15 16 17 18 19 最大值=19 最小值=15

collect 20 21 22 23 24 最大值=24 最小值=20


onEach 25 26 27 28 29

onEach 30 31 32 33 34

onEach 35 36 37 38 39

onEach 40 41 42 43 44

onEach 45 46 47 48 49

collect 25 26 27 28 29 最大值=29 最小值=25

collect 30 31 32 33 34 最大值=34 最小值=30

collect 35 36 37 38 39 最大值=39 最小值=35

collect 40 41 42 43 44 最大值=44 最小值=40

collect 45 46 47 48 49 最大值=49 最小值=45


onEach 50

collect 50 最大值=50 最小值=50

相关:

https://blog.csdn.net/zhangphil/article/details/132527122

https://blog.csdn.net/zhangphil/article/details/139237348

相关推荐
Android-Flutter3 小时前
OkHttp 总结
android·okhttp·kotlin
Kapaseker2 天前
别再只用 Loading、Success、Error 表示所有页面状态了
android·kotlin
雨白3 天前
深入理解 Kotlin 协程 (九):互通有无,解构 Channel 缓冲策略与底层无锁机制
android·kotlin
蜡台4 天前
Android WebView 设计指南
android·java·kotlin
Kapaseker4 天前
深入理解 Compose 副作用
kotlin
雨白5 天前
深入理解 Kotlin 协程 (八):拾遗补阙,探秘官方框架的调度细节与取消闭环
android·kotlin
GitLqr5 天前
别被“Flutter 传感器延迟 150ms”带偏了:这可能只是你的实现方式错了
flutter·架构·kotlin
我命由我123455 天前
Android 在构建过程中,发现有两个依赖库都包含了相同路径的资源文件
android·java·开发语言·java-ee·kotlin·android-studio·android runtime
Coffeeee5 天前
谷歌的一个优化建议,让我重新学了一遍Android里面如何正确处理位图
android·google·kotlin
Android打工仔7 天前
Continuation 到底是谁创建的?
android·kotlin