[RxJava] Combining Observables

Combining Observables

Hi ae, chắc hẳn trong quá trình dev mọi người sẽ gặp rất nhiều usecase dạng cần phải kết hợp các giá trị với nhau để làm một cái gì đấy.
Trong bài viết này mình sẽ cùng đi qua các toán tử kết hợp trong Rx thường được sử dụng để xem cách chúng hoạt động nhé :

startWith

alt text

  • Toán tử startWith phát ra item được chỉ định trước khi bắt đầu phát các item từ Observable.

  • Hoạt động với : Flowable, Observable

Observable<String> names = Observable.just("Spock", "McCoy");
names.startWith("Kirk").subscribe(item -> System.out.println(item));

Output : Kirk, Spock, McCoy

merge

alt text

  • Toán tử merge Kết hợp các Observable lại với nhau thành một bằng cách hợp các emit của chúng lại.

  • Hoạt động với : Flowable, Observable, Maybe, Single, Completable

  • Nếu bất kì source nào trong chuỗi xảy ra lỗi, onError() sẽ được bắn ra ngay và observable sẽ bị terminate.

Observable.just(1, 2, 3)
    .mergeWith(Observable.just(4, 5, 6))
    .subscribe(item -> System.out.println(item));

Output : 1, 2, 3, 4, 5, 6

mergeDelayError

alt text

  • Tương tự với merge, mergeDelayError cũng kết hợp các Observable lại với nhau thành một bằng cách hợp các emit của chúng lại.
  • Nếu bất kì source nào trong chuỗi xảy ra lỗi, onError() sẽ được giữ lại cho đến khi quá trình merge hoàn thành. Đây chính là điểm khác biệt so với toán tử merge.
  • Hoạt động với : Flowable, Observable, Maybe, Single, Completable
Observable<String> observable1 = Observable.error(new IllegalArgumentException(""));
Observable<String> observable2 = Observable.just("Four", "Five", "Six");
Observable.mergeDelayError(observable1, observable2)
        .subscribe(item -> System.out.println(item));

// emits 4, 5, 6 and then the IllegalArgumentException (in this specific
// example, this throws an `OnErrorNotImplementedException`).

zip

alt text

  • Toán tử zip kết hợp tập các item được phát ra bởi 2 hay nhiều Observable lại thông qua một function chỉ định và phát ra các item dựa trên kết quả của function này.

  • zip phát lượng item bằng lượng item được phát ra bởi source phát ít item nhất.

  • Hoạt động với : Flowable, Observable, Maybe, Single

Observable<String> firstNames = Observable.just("A", "B", "C");
Observable<String> lastNames = Observable.just("1", "2", "3");
firstNames.zipWith(lastNames, (first, last) -> first + " " + last)
    .subscribe(item -> System.out.println(item));

// Output: A 1, B 2, C 3

combineLatest

alt text

  • Khi một item được phát ra bởi một trong 2 source, nó sẽ kết hợp với item cuối cùng được phát bởi source còn lại thông qua function chỉ định và sẽ phát ra item dựa trên kết quả của function này.

  • Hoạt động với : Flowable, Observable

Observable<Long> newsRefreshes = Observable.interval(100, TimeUnit.MILLISECONDS);
Observable<Long> weatherRefreshes = Observable.interval(50, TimeUnit.MILLISECONDS);
Observable.combineLatest(newsRefreshes, weatherRefreshes,
    (newsRefreshTimes, weatherRefreshTimes) ->
        "Refreshed news " + newsRefreshTimes + " times and weather " + weatherRefreshTimes)
    .subscribe(item -> System.out.println(item));

// prints:
// Refreshed news 0 times and weather 0
// Refreshed news 0 times and weather 1
// Refreshed news 0 times and weather 2
// Refreshed news 1 times and weather 2
// Refreshed news 1 times and weather 3
// Refreshed news 1 times and weather 4
// Refreshed news 2 times and weather 4
// Refreshed news 2 times and weather 5
// ...

Conclusion

Chúc ae coding vui vẻ :trollface: :trollface: :trollface:

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

Male avatar

Hades

14 bài viết.
17 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
Male avatar
9 13
Dưới đây là một cách tổ chức thư mục mà mình cho là khá hợp lý. Hi vọng mọi người có thể tham khảo và góp ý :smile: Android_structure ├─ com.abc ...
Hades viết gần 4 năm trước
9 13
Male avatar
5 2
Những điều cần nhớ Hades 22042017 Đừng dùng lại Đừng sử dụng lại strings cho nhiều màn hình khác nhau. 1. Tưởng tượng rằng bạn có một hộp thoạ...
Hades viết hơn 3 năm trước
5 2
Male avatar
4 0
Giới thiệu RecycleView là một viewGroup mới được giới thiệu trong Android L ( API 21 ). Đây là một viewGroup có chức năng tương tự như ListView nh...
Hades viết gần 4 năm trước
4 0
Bài viết liên quan
Male avatar
0 0
Introduction Hi ae, trong bài viết này, mình sẽ cùng các bạn tìm hiểu về cách xử lý lỗi trong RxJava. Đầu tiên, hãy nhớ rằng Observable thường kh...
Hades viết 5 tháng trước
0 0
Male avatar
0 0
Introduction Hi mọi người, hôm nay chúng ta sẽ cùng tìm hiểu một số operator đơn giản và hữu ích trong Rx là Concat và Merge nhé. Concat() (Ảnh...
Hades viết 9 tháng trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


Male avatar
{{userFollowed ? 'Following' : 'Follow'}}
14 bài viết.
17 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!