Kotlin 流程中缓冲区之间的区别
Difference between buffers in Kotlin flow
据我所知,Kotlin 流程中有三种类型的缓冲区:Buffer、Conflate 和 CollectLatest,我无法弄清楚这三种终端运算符之间的区别。
flow.buffer().collect{...}
flow.collectLatest{...}
flow.conflate().collect{...}
我很抱歉太简洁了,但是这些缓冲区之间有什么区别,我们应该在什么时候使用它们?
提前感谢任何帮助。
通常,发射和收集代码 运行s 顺序,“发射器”在某处收集前一个值后发射新值。 (“收集”表示终端操作员的 lambda 已完成)。缓冲允许 运行 在收集代码的同时发出代码。
buffer() 允许发射器在旧值仍在处理时发出新值(并将它们保存在缓冲区中以备后用)。
collectLatest() 在每个收集到的新值上重新启动其 lambda,即使旧值仍在处理中。
conflate() operator skips intermediate values,这意味着在处理完当前值后,收集器仅收集在处理前一个值时收到的最新值(与 buffer(capacity = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST ).
除了指定缓冲区的确切容量外,缓冲区实际上接受与通道相同的参数。
使用 buffer 方法,您可以将参数传递给 capacity 参数以通过 buffer(capacity = Channel.<Type>)
使用任何类型的 Channel。还有一个 onBufferOverflow 参数可用于进一步自定义您的缓冲区。
Kotlin官网可以找到关于Channel类型的很好解释:
https://play.kotlinlang.org/hands-on/Introduction%20to%20Coroutines%20and%20Channels/08_Channels
buffer()
允许多个协程同时处理 emit 调用,从而节省时间而不是依次等待每个 emit 调用。
conflate()
等同于 buffer(capacity = Channel.CONFLATED)
或 buffer(capacity = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST)
如果有多个 emit 调用,它仍然会处理所有调用,但只会收集最后一个调用。
collectLatest()
,在多次emit调用的情况下,不会处理中间值。
它会取消每个后续调用,因为有新的调用可供它使用;只返回最终结果。在您只需要来自 Flow 的最多 up-to-date 调用的情况下,这为它提供了最快的处理时间。
据我所知,Kotlin 流程中有三种类型的缓冲区:Buffer、Conflate 和 CollectLatest,我无法弄清楚这三种终端运算符之间的区别。
flow.buffer().collect{...}
flow.collectLatest{...}
flow.conflate().collect{...}
我很抱歉太简洁了,但是这些缓冲区之间有什么区别,我们应该在什么时候使用它们?
提前感谢任何帮助。
通常,发射和收集代码 运行s 顺序,“发射器”在某处收集前一个值后发射新值。 (“收集”表示终端操作员的 lambda 已完成)。缓冲允许 运行 在收集代码的同时发出代码。
buffer() 允许发射器在旧值仍在处理时发出新值(并将它们保存在缓冲区中以备后用)。
collectLatest() 在每个收集到的新值上重新启动其 lambda,即使旧值仍在处理中。
conflate() operator skips intermediate values,这意味着在处理完当前值后,收集器仅收集在处理前一个值时收到的最新值(与 buffer(capacity = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST ).
除了指定缓冲区的确切容量外,缓冲区实际上接受与通道相同的参数。
使用 buffer 方法,您可以将参数传递给 capacity 参数以通过 buffer(capacity = Channel.<Type>)
使用任何类型的 Channel。还有一个 onBufferOverflow 参数可用于进一步自定义您的缓冲区。
Kotlin官网可以找到关于Channel类型的很好解释:
https://play.kotlinlang.org/hands-on/Introduction%20to%20Coroutines%20and%20Channels/08_Channels
buffer()
允许多个协程同时处理 emit 调用,从而节省时间而不是依次等待每个 emit 调用。
conflate()
等同于 buffer(capacity = Channel.CONFLATED)
或 buffer(capacity = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST)
如果有多个 emit 调用,它仍然会处理所有调用,但只会收集最后一个调用。
collectLatest()
,在多次emit调用的情况下,不会处理中间值。
它会取消每个后续调用,因为有新的调用可供它使用;只返回最终结果。在您只需要来自 Flow 的最多 up-to-date 调用的情况下,这为它提供了最快的处理时间。