Concat VS Fusion de l'opérateur

Je vérifiais la documentation de RXJava et je remarque que les opérateurs concat et merge semblent faire la même chose. J'ai écrit un test de couple pour être sûr.

@Test
public void testContact() {

    Observable.concat(Observable.just("Hello"),
                      Observable.just("reactive"),
                      Observable.just("world"))
              .subscribe(System.out::println);
}

@Test
public void testMerge() {

    Observable.merge(Observable.just("Hello"),
                      Observable.just("reactive"),
                      Observable.just("world"))
            .subscribe(System.out::println);
}

La documentation dit

L'opérateur de fusion est également similaire. Il combine les émissions de deux Observables ou plus, mais peut les entrelacer, alors que Concat n'entrelace jamais les émissions de plusieurs Observables.

Mais je ne comprends toujours pas complètement, exécutant ce test mille fois la fusion le résultat est toujours le même. Puisque l'ordre n'est pas accordé je m'attendais parfois à "réactif" "monde" "bonjour" par exemple.

Le code est ici https://github.com/politrons/reactive

24
demandé sur iMe 2016-08-11 20:54:50

1 réponses

C'est comme décrit dans la documentation que vous avez Citée - merge peut entrelacer les sorties, tandis que concat attendra d'abord la fin des flux précédents avant de traiter les flux ultérieurs. Dans votre cas, avec des flux statiques à un seul élément, cela ne fait aucune différence réelle(mais en théorie, la fusion pourrait produire des mots dans un ordre aléatoire et être toujours valide selon les spécifications). Si vous voulez voir la différence, essayez de suivre (vous devrez ajouter un peu de sommeil après pour éviter tôt sortie)

    Observable.merge(
            Observable.interval(1, TimeUnit.SECONDS).map(id -> "A" + id),
            Observable.interval(1, TimeUnit.SECONDS).map(id -> "B" + id))
    .subscribe(System.out::println);

A0 B0 A1 B1 B2 A2 B3 A3 B4 A4

Contre

    Observable.concat(
            Observable.interval(1, TimeUnit.SECONDS).map(id -> "A" + id),
            Observable.interval(1, TimeUnit.SECONDS).map(id -> "B" + id))
    .subscribe(System.out::println);

A0 A1 A2 A3 A4 A5 A6 A7 A8

Concat ne commencera jamais à imprimer B, car le flux A ne se termine jamais.

S/stream/observables/g ;)

La Documentation donne de jolis graphiques pour montrer la différence. Vous devez vous rappeler que merge ne donne aucune garantie d'entrelacement des éléments un par un, c'est juste un de possible exemple.

Concat

Opérateur Concat fusionner

Fusion de l'opérateur

90
répondu Artur Biesiadowski 2016-08-11 20:37:30