collect
로 값을 요청하지 않는 한 값을 방출하지 않음emit()
함수 사용collect
함수를 이용해 수집flowOf(0, 1, 2, 3)
.collect {
println(it)
}
코틀린의 컬렉션이나 시퀀스를 Flow로 바로 변환해주는 함수
listOf(0, 1, 2, 3)
.asFlow()
.collect {
println(it)
}
stream에서 흘러나온 데이터에 어떤 변경을 할 때 사용
suspend fun performRequest(request: Int): String {
delay(1000) // 1초 대기
return "response $request"
}
fun main() = runBlocking<Unit> {
(1..3).asFlow()
.map { performRequest(it) }
.collect { println(it) }
}
// 출력
response 1
response 2
response 3
주어진 action을 하는 flow를 반환
조건에 맞는 아이템 반환
listOf(0, 1, 2, 3, 4)
.asFlow()
.filter {
it % 2 == 0
}
.collect {
println(it)
}
// 출력
0
2
4
주어진 조건의 반대인 경우의 아이템 반환
예시
홀수만 내보냄
listOf(0, 1, 2, 3, 4)
.asFlow()
.filterNot {
it % 2 == 0
}
.collect {
println(it)
}
// 출력
1
3
몇 개의 값을 취할지 결정
listOf(0, 1, 2, 3, 4)
.asFlow()
.take(3)
.collect {
println(it)
}
// 출력
0
1
2
조건을 만족할 경우에만 값을 취함
listOf(0, 1, 2, 3, 4)
.asFlow()
.takeWhile {
it < 2
}
.collect {
println(it)
}
// 출력
0
1
처음 몇 개의 결과를 버림
listOf(0, 1, 2, 3, 4)
.asFlow()
.drop(3)
.collect {
println(it)
}
// 출력
3
4
조건을 만족하는 요소를 제외한 아이템 반환
listOf(0, 1, 2, 3, 4)
.asFlow()
.dropWhile {
it < 2
}
.collect {
println(it)
}
// 출력
2
3
4
suspend fun performRequest(request: Int): String {
delay(1000) // 1초 대기
return "response $request"
}
fun main() = runBlocking<Unit> {
(1..3).asFlow()
.transform {
emit("Making request $if")
emit(performRequest(if))
}.collect { println(if) }
}
// 출력
Making request 1
response 1
Making request 2
response 2
Making request 3
response 3
Flow를 Mutable Collection으로 변환
첫 번째 원소를 반환 -> 첫 번째 요소만 처리할 때 사용
첫 번째 원소부터 주어진 operation을 이용하여 누적시키면서 최종값을 반환 ->
연산된 결과 값을 이후의 첫 번째 인자로 넣어서 누적시키면서 계산
초기 값을 입력받아 주어진 operation을 이용하여 누적시키면서 최종값을 반환
아이템의 개수를 셈
collect와 같은 동작이지만 index 요소가 추가되어 원하는 index에 맞는 처리가 가능함
두 개의 플로우들의 값(요소)들을 병합하는 연산자