2016-08-11 19 views
15

Sprawdzałem dokumentację RXJavy i zauważam, że operatorzy konkatencji i łączenia wydają się robić to samo. Napisałem kilka testów, aby mieć pewność.Concat VS Merge operaror

@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); 
} 

Dokumentacja mówi

Operator Merge jest podobne. Łączy emisje dwóch lub więcej obserwowalnych, ale może je przeplatać, podczas gdy Concat nigdy nie przepuszcza emisji z wielu obserwowalnych.

Ale nadal nie do końca rozumiem, przeprowadzając ten test tysiąc razy wynik scalenia zawsze jest taki sam. Ponieważ zamówienie nie zostało przyznane, oczekiwałem czasami "reaktywnego" "świata" "cześć" na przykład.

Kod jest tutaj https://github.com/politrons/reactive

Odpowiedz

58

To jest taki jak opisano w dokumentacji zostały podane - scalanie może przeplatać wyjść, natomiast concat najpierw czekać na wcześniejsze strumienie zakończyć przed przetworzeniem później strumienie. W twoim przypadku, z pojedynczymi elementami, statycznymi strumieniami, nie robi to żadnej rzeczywistej różnicy (ale teoretycznie, połączenie mogłoby wysyłać słowa w losowej kolejności i nadal być ważne zgodnie ze specyfikacją). Jeśli chcesz zobaczyć różnicę, spróbuj następujących (trzeba będzie dodać trochę snu potem uniknąć przedwczesnego wyjścia)

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

kontra

A0 A1, A2, A3 A4 A5 A6 A7 A8

Concat nie rozpocznie drukowania B, ponieważ A strumienia nie zakończy się.

S// strumień zaobserwować/g;)

Dokumentacja daje przyjemne wykresy pokazują różnicę. Musisz pamiętać, że scalanie nie daje jednej po drugiej przeplatanych elementów, to tylko jeden z możliwych przykładów.

Concat

Concat operator

Merge operator

+3

Wielkie dzięki za wyjaśnienie wyjaśnienie Thiis – paul

+11

krótka notatka jest Merge że jeśli źródła są synchroniczne następnie następnie 'merge' =' concat' –

+0

Dobra uwaga !, które wyjaśniają, dlaczego mój przykład zawsze idzie w tej samej kolejności. To była część, która mnie myliła. Na przykładzie Dave'a, ponieważ jest to interwał (asynchroniczny), jest odtwarzalny – paul