轻量级和性能:Kotlin Flow相对 RxJava 更轻量,因为它不需要包含 RxJava 的所有操作符和特性。对于大多数常见的异步数据流处理场景,Kotlin Flow 提供了足够的功能,且性能通常更好。 更好的与Kotlin标准库集成:Kotlin Flow是 Kotlin 标准库的一部分,因此与其...
zip:合并两个 Flow 的元素,形成一个新的 Flow。(和集合的zip差不多) kotlin flowOf(1, 2).zip(flowOf("A", "B")) { a, b -> "$a -> $b" } combine:合并两个 Flow 的最新值。组合最新的值是什么意思呢?两个Flow中任意一个Flow有新的数据来了,那么就需要与另外一个Flow的最新的值进行组合。
正常情况下Flow内部都是常规数据(对象)在流动,但Flow本身也是一个对象,因此也可以嵌套,把流当成另一个流的数据,比如Flow<Flow<Int>>,这就是Flow of Flows of Int。Flow是数据流,最终消费者需要的是具体的数据,所以对于嵌套的Flow of Flows,通常都需要在传给终端操作符之前进行展平(flatten),得到一个faltterned...
emptyFlow<Int>() channelFlow https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/channel-flow.html 在一般的flow在构造代码块中不允许切换线程,ChannelFlow则允许内部切换线程。 //构建 val channelFlow = channelFlow<String> { send("hello") withContext(Dispatcher...
shared flow 2 操作符 • 中间操作符 一般来说是用来执行一些操作,不会立即执行,返回值还是个Flow。 • 末端操作符 会触发流的执行,返回值不是Flow。 创建Flow flow https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flow.html ...
flowA.zip(flowB) { a, b -> "$a$b" } .collect { println(it) } // 输出: A1, B2, C3 4. combine:描述:将多个流组合在一起。适用场景:需要组合两个流中的最新值。示例代码:val flowA = flowOf("Hello")val flowB = flowOf("World")flowA.combine(flowB) { a, b -> "$a $b"...
flow.combine(flow2) { i, s -> i.toString() + s }.collect { println(it)// Will print "1a 2a 2b 2c" } 结束状态跟踪 上一节提到,由于数据源和处理逻辑不在同一个地方,所以很难确定最终的数据流大小,进而不知道数据流什么时候处理结束。而且中间操作也可能会改变数据流的大小,由此就更加难以确定...
combineTransform:combine + transform操作 merge:listOf(flow1, flow2).merge(),多个流合并为一个流。 flattenConcat:以顺序方式将给定的流展开为单个流 。示例如下: flow{emit(flowOf(1,2,))emit(flowOf(3,4)) }.flattenConcat().collect{ value->print(value) ...
如上述代码所示,flow 的combine方法其参数 transform 类型是一个suspend函数,我们希望再次完成一个 Pair 的创建。这个简单的逻辑本无需使用suspend,但在 1.4 之前只能像上面这样写。 Kotlin 1.4 开始,普通函数的引用可以作为suspend函数传参,所以 1.4 之后可以改成下面的写法,代码更简洁: ...
如上述代码所示,flow 的 combine 方法其参数 transform 类型是一个 suspend 函数,我们希望再次完成一个 Pair 的创建。这个简单的逻辑本无需使用 suspend ,但在 1.4 之前只能像上面这样写。 Kotlin 1.4 开始,普通函数的引用可以作为 suspend 函数传参,所以 1.4 之后可以改成下面的写法,代码更简洁: ...