📖 Flow란?
코루틴으로 만들어진 비동기 스트림
스트림으로 변화를 추적할 수 있다.
📝 Flow 사용하기
1-1 Flow Builder
flow builder로 flow를 만들 수 있다.
1-2 주요 Flow Builder
1) flow
코드 블록으로 flow를 만들고 collect를 호출해야 값이 발생
fun flowSomething(): Flow<Int> = flow {
repeat(10) {
emit(it)
delay(10L)
}
}
fun main() = runBlocking {
flowSomething().collect { value ->
println(value)
}
}
0
1
2
3
4
5
6
7
8
9
emit으로 임의의 정수를 10번 방출하는 Flow를 생성
flowSomething에서 방출된 데이터를 collect로 수집
수집된 데이터는 println을 통해 출력
➡ emit은 Flow의 데이터를 "방출"하고, collect 블록에서 그 데이터를 받아와 println(value)를 통해 실제로 콘솔에 출력
🤔 flow만 써선 바로 출력 안되나?
flow는 콜드 스트림이다
➡ 요청(collect)이 있는 경우에 1:1로 값을 전달한다.
2) flowOf
여러 값을 인자로 전달해 플로우를 만든다.
flowOf는 emit을 자동으로 호출하는 역할을 하지만, collect가 호출되어야 데이터가 방출된다.
fun main() = runBlocking<Unit> {
flowOf(1, 2, 3, 4, 5).collect { value ->
println(value)
}
}
1
2
3
4
5
3) asFlow
컬렉션이나 시퀀스를 전달해 플로우를 만들 수 있다.
fun main() = runBlocking<Unit> {
listOf(1, 2, 3, 4, 5).asFlow().collect { value ->
println(value)
}
(6..10).asFlow().collect {
println(it)
}
}
2-1. Flow 연산자
📝1. 중간 연산자
중간 연산자는 Flow의 데이터 스트림을 변환하거나 필터링하며, 새로운 Flow를 반환한다.
중간 연산자의 종류
- map: Flow에서 방출된 각 값을 변환합니다.
- filter: 조건에 맞는 값들만 필터링하여 방출합니다.
- transform: 값을 변환하거나 여러 값을 방출할 수 있는 유연한 연산자입니다.
- take: 지정된 개수만큼의 값만 방출합니다.
- takeWhile: 조건이 참인 동안만 값을 방출합니다.
- drop: 처음 몇 개의 값을 건너뛰고 이후 값을 방출합니다.
- dropWhile: 조건이 참인 동안의 값들을 건너뜁니다.
- onEach: 각 값이 방출될 때마다 추가 작업을 수행합니다.
- flatMapConcat: 각 값을 변환하여 여러 Flow로 병합합니다. 변환된 Flow는 순차적으로 실행됩니다.
- flatMapMerge: 각 값을 변환하여 여러 Flow로 병합합니다. 변환된 Flow는 동시에 실행됩니다.
- flatMapLatest: 최신 값만을 변환하여 Flow로 병합합니다. 이전 Flow는 취소됩니다.
- mapNotNull: null이 아닌 값만 방출하고, null 값은 건너뜁니다.
- distinctUntilChanged: 이전 값과 다른 값만 방출합니다.
- debounce: 일정 시간 동안 방출된 마지막 값만 방출합니다.
- conflate: 처리 중인 값이 있는 동안 방출된 새로운 값을 버리고, 최신 값만 방출합니다.
- buffer: Flow에서 방출된 값을 버퍼링하여, 처리 속도와 방출 속도를 비동기적으로 조정합니다.
- combine: 여러 Flow의 값을 결합하여 하나의 Flow로 만듭니다.
- zip: 여러 Flow의 값을 짝지어 새로운 값을 생성합니다.
- scan: 초기 값과 Flow에서 방출된 값을 계속해서 누적하여 방출합니다.
📝2. 종단 연산자
중간 연산자는 Flow의 데이터 스트림을 변환하거나 필터링하며, 새로운 Flow를 반환한다.
종단 연산자가 호출된 후에는 Flow가 더 이상 실행되지 않기 때문에, 동일한 Flow에서 추가로 다른 종단 연산자를 사용하거나 중간 연산자를 연결할 수 없다.
종단 연산자의 종류
- collect: Flow에서 방출된 값을 수집하고 처리합니다.
- toList: Flow에서 방출된 모든 값을 리스트로 모아 반환합니다.
- toSet: Flow에서 방출된 모든 값을 세트로 모아 반환합니다.
- first: Flow에서 방출된 첫 번째 값을 반환합니다.
- single: Flow에서 방출된 단일 값을 반환합니다(Flow가 하나의 값만 방출할 때 사용).
- reduce: Flow에서 방출된 값들을 누적하여 하나의 값으로 결합합니다.
- fold: 초깃값을 지정한 후 Flow에서 방출된 값들을 누적하여 하나의 값으로 결합합니다.
- count: Flow에서 방출된 값의 개수를 셉니다.
- launchIn: Flow를 별도의 코루틴에서 수집하여 실행합니다.
- collectLatest: Flow에서 새로운 값이 방출될 때 이전 수집 작업을 취소하고 새로운 값을 수집합니다.
- last: Flow에서 방출된 마지막 값을 반환합니다.
- singleOrNull: Flow에서 방출된 단일 값이 있으면 반환하고, 없으면 null을 반환합니다.
3-1. StateFlow와 SharedFlow
Kotlin의 Flow API의 일환
📝 StateFlow
📝 SharedFlow