多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > 深入淺出RxJava(二:操作符)

深入淺出RxJava(二:操作符)

來源:程序員人生   發布時間:2015-03-11 08:16:50 閱讀次數:5780次
在第1篇blog中,我介紹了RxJava的1些基礎知識,同時也介紹了map()操作符。固然如果你并沒成心愿去使用RxJava我1點都不驚訝,畢竟才接觸了這么點??赐赀@篇blog,我相信你肯定想立即在你的項目中使用RxJava了,這篇blog將介紹許多RxJava中的操作符,RxJava的強大性就來自于它所定義的操作符。

首先先看1個例子:

準備工作

假定我有這樣1個方法:
這個方法根據輸入的字符串返回1個網站的url列表(啊哈,搜索引擎)
Observable<List<String>> query(String text);
現在我希望構建1個硬朗系統,它可以查詢字符串并且顯示結果。根據上1篇blog的內容,我們可能會寫出下面的代碼:
query("Hello, world!") .subscribe(urls -> { for (String url : urls) { System.out.println(url); } });
這類代碼固然是不能容忍的,由于上面的代碼使我們喪失了變化數據流的能力。1旦我們想要更改每個URL,只能在Subscriber中來做。我們居然沒有使用如此酷的map()操作符!??!

固然,我可使用map操作符,map的輸入是urls列表,處理的時候還是要for each遍歷,1樣很蛋疼。

萬幸,還有Observable.from()方法,它接收1個集合作為輸入,然后每次輸出1個元素給subscriber:
Observable.from("url1", "url2", "url3") .subscribe(url -> System.out.println(url));
我們來把這個方法使用到剛才的場景:
query("Hello, world!") .subscribe(urls -> { Observable.from(urls) .subscribe(url -> System.out.println(url)); });
雖然去掉了for each循環,但是代碼仍然看起來很亂。多個嵌套的subscription不但看起來很丑,難以修改,更嚴重的是它會破壞某些我們現在還沒有講到的RxJava的特性。

改進

救星來了,他就是flatMap()。
Observable.flatMap()接收1個Observable的輸出作為輸入,同時輸出另外1個Observable。直接看代碼:
query("Hello, world!") .flatMap(new Func1<List<String>, Observable<String>>() { @Override public Observable<String> call(List<String> urls) { return Observable.from(urls); } }) .subscribe(url -> System.out.println(url));
這里我貼出了全部的函數代碼,以方便你了解產生了甚么,使用lambda可以大大簡化代碼長度:
query("Hello, world!") .flatMap(urls -> Observable.from(urls)) .subscribe(url -> System.out.println(url));
flatMap()是否是看起來很奇怪?為何它要返回另外1個Observable呢?理解flatMap的關鍵點在于,flatMap輸出的新的Observable正是我們在Subscriber想要接收的?,F在Subscriber不再收到List<String>,而是收到1些列單個的字符串,就像Observable.from()的輸出1樣。

這部份也是我當初學RxJava的時候最難理解的部份,1旦我突然領悟了,RxJava的很多疑問也就1并解決了。

還可以更好

flatMap()實在不能更贊了,它可以返回任何它想返回的Observable對象。
比以下面的方法:
// 返回網站的標題,如果404了就返回null Observable<String> getTitle(String URL);
接著前面的例子,現在我不想打印URL了,而是要打印收到的每一個網站的標題。問題來了,我的方法每次只能傳入1個URL,并且返回值不是1個String,而是1個輸出String的Observabl對象。使用flatMap()可以簡單的解決這個問題。
query("Hello, world!") .flatMap(urls -> Observable.from(urls)) .flatMap(new Func1<String, Observable<String>>() { @Override public Observable<String> call(String url) { return getTitle(url); } }) .subscribe(title -> System.out.println(title));
使用lambda:
query("Hello, world!") .flatMap(urls -> Observable.from(urls)) .flatMap(url -> getTitle(url)) .subscribe(title -> System.out.println(title));
是否是感覺很不可思議?我居然能將多個獨立的返回Observable對象的方法組合在1起!帥呆了!
不止這些,我還將兩個API的調用組合到1個鏈式調用中了。我們可以將任意多個API調用鏈接起來。大家應當都應當知道同步所有的API調用,然后將所有API調用的回調結果組合成需要展現的數據是1件多么蛋疼的事情。這里我們成功的避免了callback hell(多層嵌套的回調,致使代碼難以瀏覽保護)。現在所有的邏輯都包裝成了這類簡單的響應式調用。

豐富的操作符

目前為止,我們已接觸了兩個操作符,RxJava中還有更多的操作符,那末我們如何使用其他的操作符來改進我們的代碼呢?
getTitle()返回null如果url不存在。我們不想輸出"null",那末我們可以從返回的title列表中過濾掉null值!
query("Hello, world!") .flatMap(urls -> Observable.from(urls)) .flatMap(url -> getTitle(url)) .filter(title -> title != null) .subscribe(title -> System.out.println(title));
filter()輸出和輸入相同的元素,并且會過濾掉那些不滿足檢查條件的。

如果我們只想要最多5個結果:
query("Hello, world!") .flatMap(urls -> Observable.from(urls)) .flatMap(url -> getTitle(url)) .filter(title -> title != null) .take(5) .subscribe(title -> System.out.println(title));
take()輸出最多指定數量的結果。

如果我們想在打印之前,把每一個標題保存到磁盤:
query("Hello, world!") .flatMap(urls -> Observable.from(urls)) .flatMap(url -> getTitle(url)) .filter(title -> title != null) .take(5) .doOnNext(title -> saveTitle(title)) .subscribe(title -> System.out.println(title));
doOnNext()允許我們在每次輸出1個元素之前做1些額外的事情,比如這里的保存標題。

看到這里操作數據流是多么簡單了么。你可以添加任意多的操作,并且不會弄亂你的代碼。

RxJava包括了大量的操作符。操作符的數量是有點嚇人,但是很值得你去挨個看1下,這樣你可以知道有哪些操作符可使用。弄懂這些操作符可能會花1些時間,但是1旦弄懂了,你就完全掌握了RxJava的威力。

你乃至可以編寫自定義的操作符!這篇blog不打算將自定義操作符,如果你想的話,清自行Google吧。

感覺如何?

好吧,你是1個懷疑主義者,并且還很難被說服,那為何你要關心這些操作符呢?

由于操作符可讓你對數據流做任何操作。

將1系列的操作符鏈接起來就能夠完成復雜的邏輯。代碼被分解成1系列可以組合的片斷。這就是響應式函數編程的魅力。用的越多,就會越多的改變你的編程思惟。


另外,RxJava也使我們處理數據的方式變得更簡單。在最后1個例子里,我們調用了兩個API,對API返回的數據進行了處理,然后保存到磁盤。但是我們的Subscriber其實不知道這些,它只是認為自己在接收1個Observable<String>對象。良好的封裝性也帶來了編碼的便利!


在第3部份中,我將介紹RxJava的另外1些很酷的特性,比如毛病處理和并發,這些特性其實不會直接用來處理數據。

原文鏈接
























生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 日本一级毛片视频无遮挡免费 | 婷婷我也去 | 中文国产成人精品久久96 | 国产激情久久久久久影院 | 欧美亚洲另类久久综合 | 在线欧美不卡 | 色去也| 亚洲依依成人精品 | 欧美成人高清性色生活 | 亚洲欧美日韩精品久久亚洲区 | 欧美啪啪毛片一区二区 | 国产亚洲综合一区在线 | 樱花aⅴ一区二区三区四区 影视精品网站入口 | 久久国产精品亚洲一区二区 | 搞黄视频在线观看 | 国产女人18毛片水 | 久久久久久久岛国免费播放 | 欧洲一区 | 精品色图| jiucao在线观看精品 | 日韩一级在线播放免费观看 | 久久精品亚洲 | 操的网站| 在线免费观看国产视频 | freesexmovies性医生| 亚洲精品乱码久久久久久蜜桃欧美 | 久久艹综合| 国产精品一区二区国产 | 国产在线a | 日本不卡视频在线视频观看 | 一级毛片高清大全免费观看 | 又粗又大又黄又爽的免费视频 | 国产精品视频1区 | 国产a自拍| 自拍偷拍日韩 | 欧美高清精品 | 免费人成网ww44kk44 | 亚洲精品不卡久久久久久 | 国产一区二区精品久 | 亚洲一级二级三级 | 久久久国产成人精品 |