2016-08-11 13 views
15

Tôi đã kiểm tra tài liệu của RXJava và tôi nhận thấy rằng các toán tử concat và merge có vẻ giống nhau. Tôi đã viết một vài bài kiểm tra để chắc chắn.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); 
} 

Các tài liệu nói

Nhà điều hành Merge cũng tương tự. Nó kết hợp các phát thải của hai hoặc nhiều Observables, nhưng có thể xen kẽ chúng, trong khi Concat không bao giờ xen kẽ lượng phát thải từ nhiều Observables.

Nhưng tôi vẫn chưa hiểu đầy đủ, chạy kiểm tra hàng nghìn lần kết quả hợp nhất này luôn giống nhau. Kể từ khi lệnh không được cấp, tôi đã mong đợi đôi khi "phản ứng" "thế giới" "hello" ví dụ.

Mã này là ở đây https://github.com/politrons/reactive

Trả lời

58

Nó được như mô tả trong tài liệu bạn đã trích dẫn - hợp nhất có thể interleave các kết quả đầu ra, trong khi concat đầu tiên sẽ chờ cho dòng trước đó để kết thúc trước khi xử lý các dòng sau. Trong trường hợp của bạn, với một phần tử, các luồng tĩnh, nó không tạo ra bất kỳ sự khác biệt thực sự nào (nhưng về mặt lý thuyết, việc hợp nhất có thể xuất ra các từ theo thứ tự ngẫu nhiên và vẫn hợp lệ theo spec). Nếu bạn muốn thấy sự khác biệt, hãy thử như sau (bạn sẽ cần phải thêm một số giấc ngủ sau đó để tránh sớm thoát)

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

so

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 sẽ không bao giờ bắt đầu in B, bởi vì dòng A không bao giờ kết thúc.

s/stream/observable/g;)

Tài liệu cung cấp đồ thị đẹp để hiển thị sự khác biệt. Bạn cần nhớ rằng hợp nhất không đảm bảo từng mục một, nó chỉ là một ví dụ có thể.

concat

Concat operator Merge

Merge operator

+3

vĩ đại giải thích nhờ cho rõ thiis – paul

+11

ghi chú nhanh là nếu nguồn là đồng bộ sau đó thì 'merge' = 'concat' –

+0

Điểm tốt !, giải thích tại sao ví dụ của tôi luôn theo thứ tự như vậy. Đó là phần khiến tôi bối rối. Với ví dụ về Dave vì là khoảng thời gian (không đồng bộ), nó có thể tái sản xuất – paul