Sobes.tech
Junior — Middle

Jaký je rozdíl mezi operátory zip a combineLatest v knihovně RxJava a v jakých scénářích je vhodné je použít?

sobes.tech AI

Odpověď od AI

V RxJava se operátory zip a combineLatest používají k spojení několika Observable, ale fungují odlišně:

  • zip: spojuje prvky z několika Observable podle indexů. Čeká, až každé zdrojové Observable vydá následující prvek, a poté je spojí do jednoho. Pokud jedno z Observable vydá méně prvků, výsledek je omezen na nejkratší.

  • combineLatest: při každém novém prvku jakéhokoliv Observable spojuje poslední prvek každého zdroje. Jinými slovy, jakmile jakékoliv Observable vydá novou hodnotu, combineLatest vytvoří kombinaci posledních hodnot všech Observable.

Kdy použít:

  • zip je vhodný, když je potřeba synchronizovat prvky v pořadí, například spojit data z několika zdrojů, které jsou logicky spojeny podle indexů.

  • combineLatest je užitečný, když je třeba reagovat na jakoukoli změnu ve zdrojích a mít vždy aktuální kombinaci posledních hodnot.

Příklad:

Observable<Long> obs1 = Observable.interval(1, TimeUnit.SECONDS).take(3); // 0,1,2
Observable<Long> obs2 = Observable.interval(500, TimeUnit.MILLISECONDS).take(5); // 0,1,2,3,4

// zip bude emitovat páry (0,0), (1,1), (2,2)
Observable.zip(obs1, obs2, (a, b) -> a + ":" + b)
    .subscribe(System.out::println);

// combineLatest bude emitovat kombinace při každé nové hodnotě jakéhokoliv Observable
Observable.combineLatest(obs1, obs2, (a, b) -> a + ":" + b)
    .subscribe(System.out::println);

Volba závisí na logice synchronizace dat.