zip

@ExperimentalCoroutinesApi fun <T1, T2, R> Flow<T1>.zip(
    other: Flow<T2>,
    transform: suspend (T1, T2) -> R
): Flow<R>
(source)

Zips values from the current flow (this) with other flow using provided transform function applied to each pair of values. The resulting flow completes as soon as one of the flows completes and cancel is called on the remaining flow.

It can be demonstrated with the following example:

val flow = flowOf(1, 2, 3).delayEach(10)
val flow2 = flowOf("a", "b", "c", "d").delayEach(15)
flow.zip(flow2) { i, s -> i.toString() + s }.collect {
    println(it) // Will print "1a 2b 3c"
}