Flow는 비동기로 동작하면서 여러개의 값을 반환하는 function을 만들때 사용하는 coroutine builder이다.
fun foo(): Flow<Int> = flow { // flow builder
for (i in 1..3) {
delay(100) // pretend we are doing something useful here
emit(i) // emit next value
}
}
fun main() = runBlocking<Unit> {
// Launch a concurrent coroutine to check if the main thread is blocked
launch {
for (k in 1..3) {
println("I'm not blocked $k")
delay(100)
}
}
// Collect the flow
foo().collect { value -> println(value) }
}
//출력결과
I'm not blocked 1
1
I'm not blocked 2
2
I'm not blocked 3
3
// flow 반환 함수
fun foo(): Flow<Int> = flow {
println("Flow started")
for (i in 1..3) {
delay(100)
emit(i) // collect에 값 방출
}
}
fun main() = runBlocking<Unit> {
println("Calling foo...")
val flow = foo()
println("Calling collect...")
flow.collect { value -> println(value) } // flow 수집 1
println("Calling collect again...")
flow.collect { value -> println(value) } // flow 수집 2
}
//출력결과
Calling foo...
Calling collect...
Flow started // collect 수집 (foo() 함수 실행)
1
2
3
Calling collect again...
Flow started // collect 수집 (foo() 함수 실행)
1
2
3
.asFlow ()
- 다른 Collection/Sequence들을 -> Flow로 변환// (1..3)는 Int형 배열 의미
(1..3).asFlow().collect { value -> println(value) }
//출력결과
1
2
3
.asFlow()
는 다른 컬렉션/시퀸스를 Flow로 변환, (int배열(1..3)을 -> Flow로 변환)suspend fun performRequest(request: Int): String {
delay(1000) // 1초 대기
return "response $request" // 플로우 값 매핑 "request -> response $request"
}
fun main() = runBlocking<Unit> {
(1..3).asFlow() // .asFlow() - 배열 -> Flow
.map { request -> performRequest(request) } // 대상 플로우를 매핑해서 새로운 플로우로 반환
.collect { response -> println(response) } // map으로 반환된 새 플로우에 대한 수집(collect)
}
//출력결과
response 1
response 2
response 3
suspend fun performRequest(request: Int): String {
delay(1000) // 1초 대기
return "response $request" // 플로우 값 매핑 "request -> response $request"
}
fun main() = runBlocking<Unit> {
(1..3).asFlow() // 배열 -> Flow 변환
.transform { request -> // 변환 연산자(transform)
emit("Making request $request") // emit() - flow 방출
emit(performRequest(request)) // emit() - flow 방출
}.collect { response -> println(response) } // flow 수집
}
//출력결과
Making request 1 // Flow 요소 1
response 1
Making request 2 // Flow 요소 2
response 2
Making request 3 // Flow 요소 3
response 3
emit()
을 추가하여 요소마다 여러개의 변환이 가능