원시값을 가지는 플로우
- 플로우를 만드는 가장 간단한 방법은
flowOf
함수를 사용하는 것임.
suspend fun main() {
flowOf(1, 2, 3, 4, 5).collect { print(it) } // 12345
}
컨버터
asFlow
함수를 사용해서 Iterable
, Iterator
, Sequence
를 Flow로 바꿀 수도 있음.
- 이는 즉시 사용 가능한 원소들의 플로우를 만듬.
suspend fun main() {
listOf(1, 2, 3)
.asFlow()
.collect { print(it) } // 123
}
함수를 플로우로 바꾸기
- 중단 함수를 플로우로 변환하는 것 또한 가능함.
- 플로우는 시간상 지연되는 하나의 값을 나타낼 때 자주 사용됨.
- 중단 함수의 결과가 플로우의 유일한 값이 됨.
suspend fun main() {
val function = suspend {
delay(1000)
"UserName"
}
function.asFlow().collect { print(it) } // (1초후) UserName
}
플로우 빌더
- 플로우 빌더는
sequence
, produce
빌더와 비슷하게 작동함.
- 빌더는 flow 함수를 먼저 호출하고, 람다식 내부에서 emit 함수를 사용해 다음 값을 방출함.
- Channel, Flow에서 모든 값을 방출하려면
emitAll
을 사용할 수 있음.
- emitAll(flow)는 → flow.collect { emit(it) } 를 줄여 쓴 것.
fun makeFlow(): Flow<Int> = flow {
repeat(3) { num ->
delay(1000)
emit(num)
}
}
suspend fun main() {
makeFlow().collect { print(it) }
}
플로우 빌더 이해하기
- 플로우 빌더는 플로우를 만드는 가장 기본적인 방법임.
- 다른 방법 또한 플로우 빌더를 기초로 하고 있음. 밑 flowOf 코드 또한.
public fun <T> flowOf(vararg element: T): Flow<T> = flow {
for (element in elements) {
emit(element)
}
}
- flow 빌더의 내부 동작은
collect
메서드 내부에서 block 함수를 호출하는 Flow 인터페이스를 구현함.