728x90
반응형
https://dalinaum.github.io/coroutines-example/
플로우에서는 3가지 유형의 flatMap을 지원하고 있습니다.
flatMapConcat,
flatMapMerge,
flatMapLatest
입니다.
flatMap 이란 ??
https://wooooooak.github.io/kotlin/2019/05/04/Map-vs-flatMap/
- flatMap도 map처럼 결국은 배열(또는 iterable)을 리턴한다.
- 대상이 되는 배열의 요소가 3개라면, flatMap 내부적으로도 3번 호출된다(그러나 결과는 하나의 배열 또는 이터러블 또는 옵저버블이다).
- map은 무조건 1대1 매핑이지만, flatMap은 1대1 뿐만 아니라 1대다 매핑이가능하다.
- flatMap에 넘겨주는 함수는 꼭 iterable한 값을 리턴해야한다(iterable을 평평히 펴주는 역할을 할 것임으로).
flatMapConcat
flatMapConcat은 첫번째 요소에 대해서 플레트닝을 하고 나서 두번째 요소를 합니다.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun requestFlow(i: Int): Flow<String> = flow {
emit("$i: First")
delay(500) // wait 500 ms
emit("$i: Second")
}
fun main() = runBlocking<Unit> {
val startTime = System.currentTimeMillis() // remember the start time
(1..3).asFlow().onEach { delay(100) } // a number every 100 ms
.flatMapConcat {
requestFlow(it)
}
.collect { value -> // collect and print
println("$value at ${System.currentTimeMillis() - startTime} ms from start")
}
}
실행결과
1: First at 134 ms from start
1: Second at 635 ms from start
2: First at 736 ms from start
2: Second at 1236 ms from start
3: First at 1337 ms from start
3: Second at 1837 ms from start
requestFlow(1) 호출후 끈나고, requestFlow(2)를 호출
flatMapMerge
flatMapMerge는 첫 요소의 프레트닝을 시작하며 이어 다음 요소의 플레트닝을 시작합니다.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun requestFlow(i: Int): Flow<String> = flow {
emit("$i: First")
delay(500) // wait 500 ms
emit("$i: Second")
}
fun main() = runBlocking<Unit> {
val startTime = System.currentTimeMillis() // remember the start time
(1..3).asFlow().onEach { delay(100) } // a number every 100 ms
.flatMapMerge {
requestFlow(it)
}
.collect { value -> // collect and print
println("$value at ${System.currentTimeMillis() - startTime} ms from start")
}
}
실행결과
1: First at 203 ms from start
2: First at 299 ms from start
3: First at 400 ms from start
1: Second at 704 ms from start
2: Second at 799 ms from start
3: Second at 901 ms from start
requestFlow(1) 호출후 끈날때까지 기다리지 않고 requestFlow(2)를 호출
flatMapLatest
flatMapLatest는 다음 요소의 플레트닝을 시작하며 이전에 진행 중이던 플레트닝을 취소합니다.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun requestFlow(i: Int): Flow<String> = flow {
emit("$i: First")
delay(500) // wait 500 ms
emit("$i: Second")
}
fun main() = runBlocking<Unit> {
val startTime = System.currentTimeMillis() // remember the start time
(1..3).asFlow().onEach { delay(100) } // a number every 100 ms
.flatMapLatest {
requestFlow(it)
}
.collect { value -> // collect and print
println("$value at ${System.currentTimeMillis() - startTime} ms from start")
}
}
실행결과
1: First at 185 ms from start
2: First at 321 ms from start
3: First at 422 ms from start
3: Second at 922 ms from start
requestFlow(1) 호출후 requestFlow(2) 호출시 requestFlow(1) 취소
requestFlow(2) 호출후 requestFlow(3) 호출시 requestFlow(2) 취소
728x90
반응형
'Android 공부 > Coroutine' 카테고리의 다른 글
[XX캠퍼스] 15.Kotlin Coroutines & Flow ( 완료 처리하기 ) (0) | 2022.07.27 |
---|---|
[XX캠퍼스] 14.Kotlin Coroutines & Flow ( 예외처리하기 ) (0) | 2022.07.27 |
[XX캠퍼스] 12.Kotlin Coroutines & Flow ( Flow 결합하기 ) (0) | 2022.07.26 |
[XX캠퍼스] 11.Kotlin Coroutines & Flow ( Flow 버퍼링 ) (0) | 2022.07.26 |
[XX캠퍼스] 10.Kotlin Coroutines & Flow ( Flow 컨텍스트 ) (0) | 2022.07.26 |