返回

Kotlin协程官方文档(5)-异步流

Android







Kotlin 协程官方文档(5)-异步流

在 Kotlin 中,我们可以使用集合来表示多个值。例如,有一个函数 foo(),它返回包含三个数字的 List,然后使用 forEach 打印它们:

```kotlin
fun foo(): List<Int> = listOf(1, 2, 3)

fun main() {
    foo().forEach { println(it) }
}

上一节的代码的计算操作会阻塞运行代码的主线程。当这些值由异步代码计算时,我们可以用 suspend 修饰符标记函数 foo,以便它可以在协程中使用:

suspend fun foo(): List<Int> = listOf(1, 2, 3)

fun main() {
    runBlocking {
        foo().forEach { println(it) }
    }
}

但是,如果我们想以更细粒度的控制来处理这些值,我们可以使用 Flow。Flow 是一个可以按需生成值的异步流。我们可以使用 asyncFlow 函数来创建 Flow,asyncFlow 函数返回一个 Flow,其中 T 是流中元素的类型。

fun foo(): Flow<Int> = asyncFlow {
    for (i in 1..3) {
        delay(100) // 模拟异步操作
        emit(i)
    }
}

fun main() {
    runBlocking {
        foo().collect { println(it) }
    }
}

在上面的代码中,我们使用 asyncFlow 函数创建了一个 Flow,它每隔 100 毫秒发出一个值。然后,我们使用 collect 函数来收集 Flow 中的值并打印它们。

Flow 还可以与其他协程函数一起使用,例如 map、filter 和 reduce。这些函数可以帮助我们处理和转换 Flow 中的值。

例如,我们可以使用 map 函数将 Flow 转换为 Flow

fun foo(): Flow<String> = asyncFlow {
    for (i in 1..3) {
        delay(100) // 模拟异步操作
        emit(i.toString())
    }
}

fun main() {
    runBlocking {
        foo().map { it.toInt() + 1 }.collect { println(it) }
    }
}

在上面的代码中,我们使用 map 函数将 Flow 转换为 Flow,然后使用 collect 函数来收集 Flow 中的值并打印它们。

Flow 是一个强大的工具,可以帮助我们处理异步代码。它可以与协程函数一起使用,以便我们可以更轻松地编写异步代码。