Android 공부/Coroutine

[XX캠퍼스] 13.Kotlin Coroutines & Flow ( 플래트닝 )

Machine_웅 2022. 7. 27. 14:07
728x90
반응형

https://dalinaum.github.io/coroutines-example/

 

코루틴 실습

 

dalinaum.github.io

 

플로우에서는 3가지 유형의 flatMap을 지원하고 있습니다.

flatMapConcat, 

flatMapMerge, 

flatMapLatest

입니다.

 

flatMap 이란 ??

https://wooooooak.github.io/kotlin/2019/05/04/Map-vs-flatMap/

 

map과 flatMap에 대하여 · 쾌락코딩

map과 flatMap에 대하여 04 May 2019 | kotlin FP basic FlatMap을 이해하기 위해 Map과 FlatMap의 차이점을 알아보자. Map map은 이해하기 쉽다. 반복 가능한 배열을 대상으로, 배열의 각 요소를 하나하나 순회하며

wooooooak.github.io

  • 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
반응형