Bu konuda düşündüğüm yol, flatMap
içine koymak istediğiniz işlev bir an map()
döndürdüğünüzde kullanmanızdır Observable
. Bu durumda hala kullanmaya çalışabilirsiniz, map()
ancak pratik olmaz. Nedenini açıklamaya çalışayım.
Böyle bir durumda kalmaya karar map
verirseniz, bir Observable<Observable<Something>>
. Biz hayali RxGson kütüphanesi kullanıldığı takdirde durumunda Örneğin, bu bir iade Observable<String>
's dan toJson()
yöntemi (yerine sadece dönen String
) bu şekilde görünecektir:
Observable.from(jsonFile).map(new Func1<File, Observable<String>>() {
@Override public Observable<String>> call(File file) {
return new RxGson().toJson(new FileReader(file), Object.class);
}
}); // you get Observable<Observable<String>> here
Bu noktada subscribe()
böyle bir gözlemlenebilir için oldukça zor olurdu . İçinde bir değer almak için Observable<String>
tekrar gereken bir alacaktı subscribe()
. Hangi pratik ya da bakmak hoş değil.
Bu nedenle, bir fikri kullanışlı yapmak gözlemlenebilir olan bu gözlemlenebilirleri "düzleştirmek" tir (_flat_Map adının nereden geldiğini görmeye başlayabilirsiniz). RxJava, gözlemlenebilirleri düzleştirmek için birkaç yol sağlar ve basitlik için birleştirmenin istediğimiz şey olduğunu varsayalım . Birleştirme temel olarak bir sürü gözlemlenebilir alır ve herhangi bir ses yaydığında yayılır. (Birçok kişi, geçişin daha iyi bir varsayılan olacağını savunur . Ancak yalnızca bir değer yayarsanız, bunun bir önemi yok.)
Bu yüzden önceki kod parçamızı değiştirdiğimizde:
Observable.from(jsonFile).map(new Func1<File, Observable<String>>() {
@Override public Observable<String>> call(File file) {
return new RxGson().toJson(new FileReader(file), Object.class);
}
}).merge(); // you get Observable<String> here
Bu çok daha kullanışlıdır, çünkü buna abone olmak (veya haritalama veya filtreleme veya ...) sadece String
değeri elde edersiniz . (Ayrıca, merge()
RxJava'da böyle bir varyantın olmadığını unutmayın, ancak birleştirme fikrini anlarsanız, umarım bunun nasıl çalışacağını da anlarsınız.)
Yani temelde böyle bir şey ancak gözlemlenebilir bir dönüşü merge()
başardığında muhtemelen yararlı olmalı map()
ve bu yüzden bunu tekrar tekrar yazmak zorunda değilsiniz, flatMap()
stenografi olarak yaratıldı. Eşleme işlevini normal bir şekilde uygular map()
, ancak daha sonra döndürülen değerleri yaymak yerine bunları "düzleştirir" (veya birleştirir).
Genel kullanım durumu budur. En çok Rx kullanan bir kod tabanında yer allover ve gözlemlenebilir döndüren birçok yöntem var, gözlemlenebilir döndüren diğer yöntemlerle zincirlemek istediğiniz.
Kullanım durumunuzda da yararlı olur, çünkü map()
sadece yayılan bir değeri yayılan onNext()
başka bir değere dönüştürebilir onNext()
. Ancak bunu birden çok değere dönüştüremez, hiç değer veya hata olmaz. Ve akarnokd'un cevabında yazdığı gibi (ve genel olarak benden çok daha akıllı olduğuna dikkat edin, muhtemelen genel olarak, ama en azından RxJava söz konusu olduğunda), sizin durumunuzdan istisnalar atmamalısınız map()
. Bunun yerine flatMap()
ve
return Observable.just(value);
her şey yolunda gittiğinde, ama
return Observable.error(exception);
bir şey başarısız olduğunda.
Tam bir pasaj için cevabına bakın: https://stackoverflow.com/a/30330772/1402641
subscriber.onError()
vb. Çağırmaz. Gördüğüm tüm örnekler hataları bu şekilde yönlendirdi. Bu önemli değil mi?