亲爱的读者,欢迎来到《Kotlin Flow高级技巧:操作符函数大全》。在这篇文章中,我们将深入探讨Kotlin Flow中的各种操作符,并通过具体的示例代码,帮助你理解每个操作符的实际应用。这将是一次既丰富又详细的学习之旅。 flowOf(1, 2, 3) .map { it * it } .collect { println(it) } // 输出: 1, 4, 9 flowOf(1, 2, 3) .filter { it % 2 == 1 } .collect { println(it) } // 输出: 1, 3 flowOf("Kotlin", "Flow") .transform { value -> emit(value.length) emit(value.uppercase()) } .collect { println(it) } // 输出: 6, KOTLIN, 4, FLOW (1..3).asFlow() .transformLatest { value -> emit("Processing $value") delay(100) // 模拟耗时操作 emit("Done $value") } .collect { println(it) } // 输出: Processing 1, Processing 2, Processing 3, Done 3 (1..3).asFlow() .flatMapConcat { value -> flowOf("Item: $value") } .collect { println(it) } // 输出: Item: 1, Item: 2, Item: 3 (1..3).asFlow() .flatMapMerge { value -> flow { emit("Start: $value") delay(100) // 模拟耗时操作 emit("End: $value") } } .collect { println(it) } // 输出可能是乱序的,例如: Start: 1, Start: 2, End: 1, Start: 3, End: 2, End: 3 (1..3).asFlow() .flatMapMerge { value -> flow { emit(value) delay(100) // 模拟耗时操作 emit(value + 10) } } .collect { println(it) } // 输出可能是乱序的,例如: 1, 2, 3, 11, 12, 13 val flowA = flowOf("Hello") val flowB = flowOf("World") flowA.zip(flowB) { a, b -> "$a $b" } .collect { println(it) } // 输出: Hello World val flowA = flowOf("A", "B", "C") val flowB = flowOf(1, 2, 3) flowA.zip(flowB) { a, b -> "$a$b" } .collect { println(it) } // 输出: A1, B2, C3 val flowA = flowOf("Hello") val flowB = flowOf("World") flowA.combine(flowB) { a, b -> "$a $b" } .collect { println(it) } // 输出: Hello World val flowA = flowOf("A", "B", "C").onEach { delay(100) } val flowB = flowOf(1, 2, 3).onEach { delay(150) } flowA.combine(flowB) { a, b -> "$a$b" } .collect { println(it) } // 输出: A1, B1, B2, C2, C3 flow { emit(1) throw RuntimeException("Error") } .catch { e -> emit("Caught $e") } .collect { println(it) } // 输出: 1, Caught java.lang.RuntimeException: Error var attempt = 0 flow { if (++attempt < 3) { throw Exception("Failed") } emit("Success") } .retry(2) .catch { emit("Error") } .collect { println(it) } // 输出: Success var attempt = 0 flow { if (++attempt < 3) { throw Exception("Failed") } emit("Success") } .retryWhen { cause, attempt -> cause is Exception && attempt < 2 } .catch { emit("Error") } .collect { println(it) } // 输出: Success flow { for (i in 1..3) { delay(100) // 假设这是一项耗时操作 emit(i) } } .conflate() .collect { value -> delay(300) // 模拟慢速消费者 println(value) } // 输出: 1, 3 (跳过了2) flow { for (i in 1..3) { emit(i) delay(100) } } .buffer() .collect { value -> delay(300) println(value) } // 输出不会因为消费者的延迟而受阻 val stateFlow = flowOf(1, 2, 3) .stateIn(coroutineScope) println(stateFlow.value) // 输出: 3 flowOf("Start", "Middle", "End") .onStart { println("Flow starts") } .onCompletion { println("Flow completes") } .collect { println(it) } // 输出: Flow starts, Start, Middle, End, Flow completes val flowA = flowOf(1, 2, 3) val flowB = listOf(4, 5, 6).asFlow() flowA.zip(flowB) { a, b -> a + b } .collect { println(it) } // 输出: 5, 7, 9 emptyFlow<Int>() .collect { println(it) } // 不输出任何东西 callbackFlow { val callback = object : SomeCallback { override fun onEvent(event: Event) { trySend(event).isSuccess // 发射事件 } } registerCallback(callback) awaitClose { unregisterCallback(callback) } // 在Flow被取消时解除回调 } channelFlow { val job1 = launch { // 模拟一些异步操作 delay(100) send("Result 1") } val job2 = launch { // 另一个异步操作 delay(200) send("Result 2") } job1.join() // 等待任务完成 job2.join() close() // 手动关闭Flow } 对比总结 val firstValue = flowOf(1, 2, 3).first() // 返回1 val firstOrNullValue = emptyFlow<Int>().firstOrNull() // 返回null val singleValue = flowOf(1).single() // 返回1 val singleOrNullValue = emptyFlow<Int>().singleOrNull() // 返回null flowOf(1, 1, 2, 2, 3) .distinctUntilChanged() .collect { println(it) } // 输出: 1, 2, 3 flowOf(1, 2, 3) .debounce(100) // 延迟100毫秒 .collect { println(it) } // 输出: 3 flow { emit(1) delay(50) emit(2) delay(100) emit(3) } .sample(100) // 每100毫秒采样一次 .collect { println(it) } // 输出: 1, 3转换操作符
组合操作符
错误处理
性能优化
状态和生命周期操作符
特殊流构建器
更多其他操作符