[kotlin] 코틀린(Kotlin) Flow의 결합 연산자

코틀린의 Flow는 비동기로 값을 계산하거나 데이터를 전송하는 데 사용됩니다. Flow에서 여러 연산자를 사용하여 여러 개의 플로우를 결합할 수 있습니다. 이는 데이터를 효과적으로 처리하고 필요한 형식으로 조작하는 데 도움이 됩니다.

Flow의 결합 연산자

코틀린 Flow에서 가장 일반적으로 사용되는 결합 연산자는 zip, combine, concat, merge 등이 있습니다.

Zip

zip 연산자는 각각의 플로우에서 하나의 값을 가져와서 새로운 값을 생성하는 데 사용됩니다. 이는 두 개의 플로우를 하나로 합칠 때 유용합니다.

Exmaple

import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking

fun main() = runBlocking {
    val nums = (1..3).asFlow()
    val strs = flowOf("one", "two", "three")
    nums.zip(strs) { a, b -> "$a -> $b" }.collect { println(it) }
}

이 코드는 nums 플로우와 strs 플로우를 zip하여 새로운 조합된 값을 출력합니다. 결과:

1 -> one
2 -> two
3 -> three

Combine

combine 연산자는 각각의 플로우에서 새로운 값이 전달될 때마다 새로운 값을 생성하는 데 사용됩니다.

Example

import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking

fun main() = runBlocking {
    val nums = (1..3).asFlow().onEach { delay(300) } // numbers 1..3 every 300 ms
    val strs = flowOf("one", "two", "three").onEach { delay(400) } // strings every 400 ms
    val startTime = currentTimeMillis() // remember the start time
    nums.combine(strs) { a, b -> "$a -> $b" } // compose a single string
        .collect { value -> 
            println("$value at ${currentTimeMillis() - startTime} ms from start") 
        } // collect and print
}

결과:

1 -> one at 501 ms from start
2 -> one at 802 ms from start
2 -> two at 1003 ms from start
3 -> two at 1105 ms from start
3 -> three at 1407 ms from start

Concat

concat 연산자는 먼저 한 플로우를 완료한 후에 두 번째 플로우를 시작합니다.

Example

import kotlinx.coroutines.flow.*
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking

fun main() = runBlocking {
    val nums = (1..3).asFlow().onEach { delay(300) } // numbers 1..3 every 300 ms
    val strs = flowOf("one", "two", "three").onEach { delay(400) } // strings every 400 ms
    val startTime = currentTimeMillis()
    nums.concat(strs).collect { value -> // compose a single string
            println("$value at ${currentTimeMillis() - startTime} ms from start")
    }
}

결과:

1 at 319 ms from start
2 at 619 ms from start
3 at 919 ms from start
one at 1320 ms from start
two at 1721 ms from start
three at 2121 ms from start

Merge

merge 연산자는 모든 플로우에서 값이 전달될 때마다 값을 생성하는 데 사용됩니다.

Example

import kotlinx.coroutines.flow.*
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking

fun main() = runBlocking {
    val nums = (1..3).asFlow().onEach { delay(300) } // numbers 1..3 every 300 ms
    val strs = flowOf("one", "two", "three").onEach { delay(400) } // strings every 400 ms
    val startTime = currentTimeMillis() // remember the start time
    nums.merge(strs).collect { value -> // collect and print
        println("$value at ${currentTimeMillis() - startTime} ms from start")
    }
}

결과:

one at 401 ms from start
1 at 601 ms from start
two at 801 ms from start
2 at 901 ms from start
3 at 1203 ms from start
three at 1205 ms from start

위의 예제를 사용하여 코틀린 Flow의 결합 연산자가 실제로 어떻게 작동하는지 알아보았습니다.

더 많은 정보는 Kotlin Flow 공식 문서를 참조하세요.