본문 바로가기

Kotlin

Flow 결합 연산자 : zip, combine

Coroutine Flow는 Flow를 결합할 수 있는 연산자 zip과 combine을 제공하고 있다.

두 연산자 동작에 어떤 차이가 있는지 알아보자

zip

  • 결합된 모든 flow의 결과값이 올 때까지 기다렸다 방출한다.
  • flow 결과값들이 1:1로 결합하는 방식
  • 모든 flow의 방출이 완료될 때까지 작동한다.

 

그림으로 보면 이해가 쉽다

flow1

- Blue Circle이 방출되고 1초 후 Red Circle이 방출된다.

 

flow2

- Blue Square가 방출되고 2초 후 Red Square가 방출된다.

 

flow1.zip(flow2) 의 결과값은?

1. Blue Circle과 Blue Square가 결합된다.

2. 1초 후 방출된 Red Circle은 대응되는 값이 없기 때문에 기다린다. 

3.다시 1초 후 방출되는 Red Square와 결합된다.

 

zip은 모든 flow의 값들이 방출되어야 종료가 되기 때문에, 값이 방출되지 않으면 무한정으로 기다릴 수도 있을 것 같다

timeout 같은걸 설정하면 이런 동작을 방지할 수 있지 않을까..? 관련해서는 다음에 알아봐야겠다.

combine

  • 가장 최신의 값들을 결합하여 방출한다.
  • zip과 마찬가지로 모든 방출이 완료되면 종료된다.

역시 말보단 그림이 더 이해하기 쉽다

 

flow1,2의 동작은 위와 같다

 

flow1.combine(flow2) 의 결과값은?

1. Blue Circle과 Blue Square가 결합된다

2. 1초 후 방출된 Red Circle은 Blue Square와 결합된다. 

3. 1초 후 방출된 RedSquare는 flow1의 가장 최신값인 Red Circle과 결합된다.

 

 

 

 

결론

zip은 결합한 모든 flow 의 값들이 방출되기를 기다렸다 결합한다.

combine은 결합한 flow의 최신 값들이 결합한다.

'Kotlin' 카테고리의 다른 글

== 과 ===의 차이  (0) 2023.04.18
Inner class 와 Nested Class 차이  (0) 2023.04.18
operator fun invoke  (0) 2023.04.10
정렬  (0) 2023.01.09
코루틴 1  (0) 2022.05.12