비동기 Flow
- 일시 중단 함수들은 비동기적으로 단일 값을 반환함.
- 비동기적으로 계산한 복수의 값들을 반환하기 위해 Kotlin의 Flows가 등장함.
Kotlun의 Flow는 순차적으로 값을 내보내고 정상적으로 또는 예외로 완료되는 비동기적인 데이터 스트림입니다.
복수의 값들 표현
- Collection을 사용하여 Kotlin에서 복수의 값을 나타낼 수 있음.
- 세 개의 숫자 목록을 반환한 다음 forEach를 사용하여 모두 출력하는 간단한 함수를 가질 수 있음.
fun simple(): List<Int> = listOf(1, 2, 3)
fun main() {
simple().forEach { value -> println(value) }
}
실행결과
1
2
3
Sequences
- CPU 리소스를 사용하면서 블로킹 하는 코드로 숫자에 대한 연산을 한다면
Sequence
를 사용해 숫자를 나타낼 수 있음.
fun simple(): Sequence<Int> = sequence { // sequence builder
for (i in 1..3) {
Thread.sleep(100) // pretend we are computing it
yield(i) // yield next value
}
}
fun main() {
simple().forEach { value -> println(value) }
}
- 위 예제에선
Sequence
를 사용 안해도 됨.
일시중단 함수들
- 위
Sequence
예제는 메인 스레드를 블로킹함.
- 스레드를 블로킹 시키지 않고 비동기 코드에 의해 계산된다면,
suspend
키워드를 붙여 수정할 수 있음.
import kotlinx.coroutines.*
suspend fun simple(): List<Int> {
delay(1000)
return listOf(1, 2, 3)
}
fun main() = runBlocking<Unit> {
simple().forEach { value -> println(value) }
}
Flows
- 결과 타입으로
List<XXX>
를 사용하면 한 번에 모든 값을 반환해야함.
- 동기적으로 계산된 값은
Sequence<XXX>
를 사용해 나타냈던 것처럼
- 비동기적으로 계산되는 값들을 스트림으로 나타내려면
Flow<XXX>
타입을 사용할 수 있음.