Coroutines Flow 5편 –

여러 흐름을 하나로 병합

여러 흐름을 결합하는 방법에는 여러 가지가 있습니다.

지퍼

Kotlin 표준 라이브러리에서 시퀀스.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 -> three

결합하다

Flow가 마지막 값 또는 작업을 표시할 때(갈등(관련 섹션 참조) 흐름의 마지막 값에 따라 달라지는 작업을 수행해야 하거나 업스트림에서 새 값을 내보낼 때 다시 계산해야 할 수 있습니다.
작업을 수행하는 운영자 그룹 결합하다그것은이라고.

예를 들어 앞의 예에서 숫자는 300ms마다 업데이트되지만 문자열은 400ms마다 업데이트되는 경우, 지퍼 연산자를 사용한 zip 작업은 결과가 400ms마다 인쇄되지만 동일한 결과를 생성합니다.

이 예에서 각각에 중간 연산자를 사용하여 각 요소를 연기하고 예제 흐름을 출력하는 코드를 선언적이고 짧게 만듭니다.

val nums = (1..3).asFlow().onEach { delay(300) } // numbers 1..3 every 300 ms
val strs = flowOf("one", "two", "three").onEach { delay(400) } // strings every 400 ms
val startTime = System.currentTimeMillis() // remember the start time 
nums.zip(strs) { a, b -> "$a -> $b" } // compose a single string with "zip"
    .collect { value -> // collect and print 
        println("$value at ${System.currentTimeMillis() - startTime} ms from start") 
    }

완전한 코드는 여기에서 찾을 수 있습니다

하지만, 지퍼 대신에 결합하다시도:

val nums = (1..3).asFlow().onEach { delay(300) } // numbers 1..3 every 300 ms
val strs = flowOf("one", "two", "three").onEach { delay(400) } // strings every 400 ms          
val startTime = System.currentTimeMillis() // remember the start time 
nums.combine(strs) { a, b -> "$a -> $b" } // compose a single string with "combine"
    .collect { value -> // collect and print 
        println("$value at ${System.currentTimeMillis() - startTime} ms from start")
    }

완전한 코드는 여기에서 찾을 수 있습니다

지불하다 또는 거리 Flow의 각 버전에서 라인이 인쇄되는 완전히 다른 결과를 얻을 수 있습니다.

1 -> one at 452 ms from start
2 -> one at 651 ms from start
2 -> two at 854 ms from start
3 -> two at 952 ms from start
3 -> three at 1256 ms from start


다음 내용은 독자의 이해를 돕기 위해 번역자가 추가한 내용입니다.

* zip은 두 개의 값을 압축하여 하나의 값으로 내보내는 반면 Combine은 각 값을 출력에 결합하여 하나의 값으로 내보냅니다.


이 문서는 공식 코루틴 문서를 번역한 것입니다.

원래의: 비동기 흐름 – 여러 흐름 조합

원본 텍스트의 최종 편집: 2022년 9월 28일


매끄러운*1 흐름

흐름은 비동기적으로 수신되는 일련의 값을 나타내며 각 값이 다른 일련의 값을 요청하는 것은 매우 쉽습니다.
예를 들어, 500ms로 구분된 두 문자열을 반환하는 다음 함수가 있다고 가정해 보겠습니다.

fun requestFlow(i: Int): Flow<String> = flow {
    emit("$i: First")
    delay(500) // wait 500 ms
    emit("$i: Second")
}

한 번에 세 개의 정수를 출력하는 흐름이 있는 경우 요청 흐름우리가 전화한다고 가정 해 봅시다

(1..3).asFlow().map { requestFlow(it) }

추가 처리를 위해 단일 흐름으로 축소해야 하는 흐름의 흐름입니다(흐름>) 컬렉션과 시퀀스는 이 상황을 위한 것입니다.
수준수업 플랫맵 연산자가 있습니다.
그러나 Flow의 비동기 환경으로 인해 Flow는 다른 축소 방법이 필요하며 Flow를 위한 여러 축소 연산자가 있습니다.

flatMapConcat*2

flatMapConcat수업 flattenConcat강의 강 * 3에 연결됩니다.
이들은 해당 시퀀스 연산자의 가장 직접적인 유사체*4입니다.
다음 예제와 같이 새 값을 캡처하기 전에 내부 흐름이 처리를 완료할 때까지 기다립니다.

val startTime = System.currentTimeMillis() // remember the start time 
(1..3).asFlow().onEach { delay(100) } // emit a number every 100 ms 
    .flatMapConcat { requestFlow(it) }                                                                           
    .collect { value -> // collect and print 
        println("$value at ${System.currentTimeMillis() - startTime} ms from start") 
    }

완전한 코드는 여기에서 찾을 수 있습니다

flatMapConcat의 순차적 특성은 출력에서 ​​분명합니다.

1: First at 121 ms from start
1: Second at 622 ms from start
2: First at 727 ms from start
2: Second at 1227 ms from start
3: First at 1328 ms from start
3: Second at 1829 ms from start

flatMapMerge*5

평탄화의 또 다른 방법은 수집된 모든 값을 한 번에 수집한 다음 수집된 값을 흐름으로 가져와 가능한 한 빨리 값이 해제될 수 있도록 하는 것입니다.
그건 flatMapMerge, 스무드머지 운영자에 의해 구현됩니다.
둘 다 선택 사항입니다 동시성 한 번에 수집되는 흐름의 수를 제한하는 매개변수를 받습니다(이 값은 기본값임). DEFAULT_CONCURRENCY 설정됩니다).

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") 
    }

완전한 코드는 여기에서 찾을 수 있습니다

flatMapMerge의 동시적 특성이 명확해집니다.

1: First at 136 ms from start
2: First at 231 ms from start
3: First at 333 ms from start
1: Second at 639 ms from start
2: Second at 732 ms from start
3: Second at 833 ms from start

flatMapMerge코드 블록 내의 코드 블록입니다(이 예에서는 {requestFlow(it)})은 순차적으로 호출되지만 결과 데이터 흐름은 동시에 캡처됩니다.
그건 지도 {requestFlow(it)} 첫 번째 전화 스무드머지순차적으로 호출하는 것과 같습니다.
*6

flatMap최신*7

버퍼링 – 마지막 값 처리 섹션에 설명 수집최근 연산자와 마찬가지로 새 흐름의 수집이 실행될 때 이전 흐름의 수집 처리가 중단되는 “최신” 평면화 체계가 있습니다.
그건 flatMap최근 운영자에 의해 구현됩니다.

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") 
    }

완전한 코드는 여기에서 찾을 수 있습니다

이 예제의 출력은 다음과 같습니다.
flatMap최근이것은 작동 방식에 대한 좋은 설명입니다.

1: First at 142 ms from start
2: First at 322 ms from start
3: First at 425 ms from start
3: Second at 931 ms from start

새로운 값이 기록되면, flatMap최근블록입니다(이 예에서는 {requestFlow(it)}) 포함된 모든 코드를 삭제합니다.
이 예에서 무엇 요청 흐름일시 중지되지 않고 중단되지 않도록 빠르게 호출되기 때문에 변경 사항을 가져오지 않습니다.
하지만 요청 흐름 내부에 지연일시 중지 기능이 있으면 다른 결과가 표시됩니다.


다음 내용은 독자의 이해를 돕기 위해 번역자가 추가한 내용입니다.

*하나. Flatten에 대한 올바른 단어를 찾을 수 없습니다.
Flatten은 영어를 사용합니다.

*2. flatMapConcat에 대한 자세한 내용은 다음 문서를 참조하세요.

(코루틴 흐름) flatMapConcat을 사용하여 흐름을 다른 흐름으로 변환

Flow의 평면화 연산자 흐름은 데이터 파이프라인입니다.
코드에서 데이터 파이프라인은 단독으로 사용되는 경우가 거의 없으며 일반적으로 다른 데이터 파이프라인과 결합하여 단일 데이터 파이프를 형성합니다.

kotlinworld.com

*삼. “리버 플로우”는 흐름을 의미합니다.
> .

*4. 컨텍스트에서 연산자 flatten 및 flatMap과 flattenConcat 및 flatMapConcat이 가장 유사한 연산자인 것 같습니다.

*5. flatMapMerge에 대해 자세히 알아보려면 다음 문서를 읽어보세요.

(코루틴 흐름) flatMapMerge를 사용한 흐름 변환의 동시 처리

flatMapMerge는 무엇을 합니까? flatMapConcat 및 flatMapLatest는 흐름에서 데이터 출력을 변환할 때 출력되는 순서대로 순차적으로 변환합니다.
반대로 flatMapMerge는 변환을 병렬로 수행합니다.
대부분의 용

kotlinworld.com

*6. {requestFlow(it)} 맵이 호출되면 Flow> 생성되었습니다.
이후에 flattenMerge가 호출되면 내부 흐름이 동시에 수집되는데 이는 flatMapMerge { requestFlow(it) }와 동일합니다.

*7. flatMapLatest에 대한 자세한 내용은 다음 문서를 참조하세요.

(Coroutine Flow) flatMapLatest를 사용하여 최신 데이터만으로 흐름 변환

flatMapLatest란 무엇입니까? flatMapLatest는 최신 데이터만 사용하여 흐름을 새로운 흐름으로 변환하는 데 도움을 주는 기능입니다.
flatMapLatest를 사용하면 흐름에 의한 데이터 출력이 변환되면서 새로운 데이터가 생성됩니다.

kotlinworld.com


이 문서는 공식 코루틴 문서를 번역한 것입니다.

원래의: 비동기 흐름 – 흐름 평탄화

원본 텍스트의 최종 편집: 2022년 9월 28일