如何从流程中收集项目直到满足特定条件?

Arp*_*kla 2 kotlin kotlin-coroutines kotlin-flow

我有一个Flow<List<Int?>>,我想收集这个流,但直到我得到一个空的 Int。然后流程应该被取消。例如,

val flow = flowOf(
    listOf(1, 2),
    listOf(3, null),
    listOf(4)
)
flow.collectUntilNull {
    println(it)
}
Run Code Online (Sandbox Code Playgroud)

我想要的输出是:

[1, 2]
[3, null]
Run Code Online (Sandbox Code Playgroud)

我知道有一个函数Flow.takeWhile,但它不会发出谓词返回 false 的值。就我而言,我也想要那个。

[1, 2]
[3, null]
Run Code Online (Sandbox Code Playgroud)

由于collectWhile是内部的,我无法使用此代码。虽然我想我可以复制粘贴该collectWhile实现到我的代码中。但还有其他方法可以做到这一点吗?

IR4*_*R42 8

transformWhile是一个更灵活/通用的takeWhile.

flow
    .transformWhile {
        emit(it)
        myCondition(it)
    }
    .collect {
        println(it)
    }
Run Code Online (Sandbox Code Playgroud)