공식 문서 번역/Coroutines 공식 문서
Coroutines Flow 7편 - Flow 수집 완료 처리하기, Flow 명령적으로 다루기 vs 선언적으로 다루기
Flow 수집 완료 처리하기 flow 수집이 완료되면(정상적으로 혹은 예외가 발생되어서), 완료에 따른 동작을 실행해야 할 수 있다. 이미 알 수도 있듯이, 이는 명령적인 방식 혹은 선언적인 방식 두가지 방식으로 실행될 수 있다. 명령적인 finally 블록 try/catch에 더해서, 수집기는 collect 동작이 완료됨에 따라 동작을 실행하는 finally 블록을 사용할 수 있다. fun simple(): Flow = (1..3).asFlow() fun main() = runBlocking { try { simple().collect { value -> println(value) } } finally { println("Done") } } 📌 전체 코드는 이곳에서 확인할 수 있습니다. 이 코드는 si..
Coroutines Flow 6편 - Flow 예외 처리, Flow의 예외 투명성
Flow 예외 처리 Flow 수집은 방출하는 곳 혹은 연산자 안의 코드가 예외를 발생시키는 경우 예외와 함께 완료될 수 있다. 예외들을 처리할 수 있는 몇가지 방법이 있다. 수집기에서의 try와 catch 수집기는 예외를 처리하기 위해 Kotlin의 try/catch 블록을 사용할 수 있다 : fun simple(): Flow = flow { for (i in 1..3) { println("Emitting $i") emit(i) // emit next value } } fun main() = runBlocking { try { simple().collect { value -> println(value) check(value check(value println(value) } } catch (e: Th..
Coroutines Flow 5편 - 여러 Flow 하나로 합치기, Flow를 Flatten하기 - flatMapConcat, flatMapMerge, flatMapLatest
여러 Flow 하나로 합치기 복수의 Flow를 합치는 다양한 방법이 있다. Zip Kotlin 표준 라이브러리 상의 Sequence.zip 확장 함수처럼, Flow는 두 개의 Flow의 값을 결합하는 zip 연산자를 가지고 있다. val nums = (1..3).asFlow() // numbers 1..3 val strs = flowOf("one", "two", "three") // strings nums.zip(strs) { a, b -> "$a -> $b" } // compose a single string .collect { println(it) } // collect and print 📌 전체 코드는 이곳에서 확인할 수 있습니다. 이 예제는 다음을 출력한다. 1 -> one 2 -> two 3 -..
Coroutines Flow 4편 - Flow의 수집이 일어나는 Context, Flow Buffering - buffer, conflate, collectLatest
Flow의 수집이 일어나는 Context Flow의 수집은 언제나 Coroutine을 호출하는 Context상에서 일어난다. 예를 들어 만약 simple이라 불리는 Flow가 있다면, 다음의 코드의 simple Flow는 구체적인 구현과 상관없이 코드 작성자가 지정한 Context상에서 실행된다 : withContext(context) { simple().collect { value -> println(value) // run in the specified context } } Flow의 이러한 성질은 컨텍스트 보존(context preservation)이라 불린다. 따라서 기본적으로 flow { ... } 빌더 내부의 코드는 해당 Flow의 collector가 제공하는 Context 상에서 실행된다. ..
Coroutines Flow 3편 - Flow 터미널 연산자, Flow는 순차적이다
Flow 터미널 연산자 Flow의 터미널 연산자는 flow를 수집을 시작하는 일시정지 함수*1이다. collect 연산자는 가장 기본 연산자이지만, 사용을 더 쉽게 만드는 다른 터미널 연산자들도 있다. 다양한 Collection으로의 변환을 수행하는 toList 와 toSet 같은 연산자.*2 첫 값만 가져오기 위한 first 연산자와 하나의 값만 방출되는 것을 확인하는 single 연산자.*3 flow를 값으로 줄이는 reduce나 fold를 연산자. 예를 들어 : val sum = (1..5).asFlow() .map { it * it } // squares of numbers from 1 to 5 .reduce { a, b -> a + b } // sum them (terminal operator)..