Có một phương pháp thể hiện trên rx.Observable
được gọi là x()
(link) có thể được sử dụng để bí mật một giá trị quan sát trực tiếp và trôi chảy. Mục đích của toán tử này là xây dựng một kho lưu trữ các hàm chuyển đổi có thể chuyển một Observable thành các kiểu dữ liệu đồng bộ/không đồng bộ khác (chẳng hạn như các loại quan sát khác) hoặc chỉ đơn giản là unwrap nội dung của quan sát vào các giá trị chứa. Viết chức năng chuyển đổi một lần và lưu trữ nó đi để sử dụng lặp đi lặp lại.
Phương pháp chữ ký:
public <R> R x(Func1<? super OnSubscribe<T>, ? extends R> conversion);
Cách sử dụng để chuyển đổi một tiềm năng không đồng bộ quan sát được vào một danh sách đồng thời:
List<Integer> list = Observable.range(1, 10).x(new Func1<OnSubscribe<Integer>, List<Integer>>() {
@Override
public List<Integer> call(OnSubscribe<Integer> onSubscribe) {
List<Integer> allElements = new ArrayList<Integer>();
CountDownLatch latch = new CountDownLatch(1);
AtomicReference<Throwable> failure = new AtomicReference<Throwable>();
onSubscribe.call(new Subscriber<Integer>(){
@Override
public void onCompleted() {
latch.countDown();
}
@Override
public void onError(Throwable e) {
failure.set(e);
}
@Override
public void onNext(Integer t) {
allElements.add(t);
}});
while (true) {
try {
latch.await();
break;
} catch (InterruptedException e1) {
// continue waiting
}
}
Throwable e = failure.get();
if (e != null)
throw new RuntimeException(e);
return allElements;
}});
System.out.println(list);
đầu ra
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Xin lưu ý rằng toán tử này hiện đang @Experimental
và rất có khả năng được đổi tên (để "mở rộng"), tuy nhiên e chức năng xperimental trong RxJava có thể là changed in any release.
vâng tôi đồng ý nhưng, trong trường hợp của tôi, tôi không đồng ý: p Đầu tiên vì tôi đang sử dụng Android, vì vậy tôi không có java8. Một lý do khác, tôi phải làm điều đó biến đổi trong cách bình thường-java anyway, vì vậy đối với tôi rxOperators sạch hơn. Bạn thấy quan điểm của tôi? –
@ user3806331 một tùy chọn khác cho Android là https://github.com/konmik/solid – LordRaydenMK
Android không (chưa) có Luồng và Ổi chứa số lượng tham chiếu phương thức * lớn * (không tốt cho giới hạn dex 65k của Android) . RxJava là phổ biến trong các ứng dụng Android và sử dụng nó thay cho Stream vv là khá hợp lý tôi cảm thấy. – Tom