1. 程式人生 > >徹底瞭解RxJava —— flatMap()

徹底瞭解RxJava —— flatMap()

原文連結

第1部分中,我討論了RxJava的基本結構,並介紹了map()operator。但是,如果你仍然沒有意願去使用RxJava,我可以理解。因為還你沒有大量的工作。但是這將迅速改變–RxJava的大部分功能是包含在在框架中的所有Operators。

讓我們通過一個例子向你介紹更多的Operators。

假設

假設我這樣一個方法:

// Returns a List of website URLs based on a text search
Observable<List<String>> query(String text); 

我想做一個健壯的系統來搜尋文字和顯示結果。鑑於我們從上一篇文章中知道的,這是可能想出來的:

query("Hello, world!")
    .subscribe(urls -> {
        for (String url : urls) {
            System.out.println(url);
        }
    });

這個答案令人非常不滿意,因為我失去了轉換資料流的能力。如果我想修改每個URL,我必須在Subscriber去做,而沒有去使用強大的map()處理。

我可以從urls - > urls建立一個map(),但是每個map()呼叫都會有一個for-each迴圈。

希望之光

如下的方法,Observable.from()會遍歷集合

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迴圈,但是一團糟,有多個巢狀訂閱!除了醜陋和難以修改,它也打破了RxJava的一些關鍵但尚未發現的功能。

更好的方案

flatMap()

Observable.flatMap()獲取一個Observable例項,並返回另一個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));

flatMap()很奇怪,對吧?為什麼它返回另一個Observable?這裡的關鍵概念是返回的新Observable是被訂閱的。它並沒有接收List< String > ,它獲得一系列由Observable.from()返回的單個字串。

甚至更好

flatMap()可以返回任何它想要的Observable

假設我有第二種方法:

// Returns the title of a website, or null if 404
Observable<String> getTitle(String URL);

現在我要列印每個收到的網站的標題,而不是列印網址。但是有一些問題:我的方法一次只處理一個URL,它不返回一個String,它返回一個發出String的Observable。

使用flatMap(),解決這個問題很容易;在將URL列表拆分為單獨的專案後,我可以在flatMap()中為每個URL使用getTitle(),然後再到Subscriber:

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));

提升

除了map和flatMap兩種operators,還有很多。對上面的操作還可以改進。如果URL是404的時候,getTitle()返回null。

  • 我們不想輸出“null”,則可以進行過濾
query("Hello, world!")
    .flatMap(urls -> Observable.from(urls))
    .flatMap(url -> getTitle(url))
    .filter(title -> title != null)
    .subscribe(title -> System.out.println(title));

filter 的引數和結果是同一個值,它僅僅對boolean進行判斷。

  • 最多顯示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() 可以新增其他動作,針對每個Item。

相關推薦

徹底瞭解RxJava —— flatMap()

原文連結 在第1部分中,我討論了RxJava的基本結構,並介紹了map()operator。但是,如果你仍然沒有意願去使用RxJava,我可以理解。因為還你沒有大量的工作。但是這將迅速改變–RxJava的大部分功能是包含在在框架中的所有Operators。

三分鐘徹底瞭解Restful最佳實踐

REST是英文representational state transfer(表象性狀態轉變)或者表述性狀態轉移;Rest是web服務的一種架構風格;使用HTTP,URI,XML,JSON,HTML等廣泛流行的標準和協議;輕量級,跨平臺,跨語言的架構設計;它是一種設計風格,不是一種標準,是一種思想 Rest

FW: 幫 C/C++ 程式設計師徹底瞭解連結器

幫 C/C++ 程式設計師徹底瞭解連結器 2015/12/18 · C/C++, 開發 · 3 評論 · C語言, 連結器   本文由 伯樂線上 - 小胖妞妞 翻譯, 黃小非 校稿。未經許可,禁止轉載! 英文出處:

如果你現在對Python爬出蠢蠢欲動?那麼我現在帶你徹底瞭解它!

    1. 爬蟲概述 簡單來說,爬蟲就是獲取網頁並提取和儲存資訊的自動化程式,下面概要介紹一下。 (1) 獲取網頁     (2) 提取資訊 獲取網頁原始碼後,接下來就是分析網頁原始碼,從中提取我們想要的資料。首先

設計模式23種全解析(5分鐘徹底瞭解23種設計模式)

一、設計模式的分類 總體來說設計模式分為三大類: 建立型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。 結構型模式,共七種:介面卡模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。 行為型模式,共十一種:策略模式、模板

徹底瞭解程式設計師學習大資料開發的優勢在哪裡,轉行輕鬆度過菜鳥期

1.Linux基礎和分散式叢集技術 學完此階段可掌握的核心能力: 熟練使用Linux,熟練安裝Linux上的軟體,瞭解熟悉負載均衡、高可靠等叢集相關概念,搭建網際網路高併發、高可靠的服務架構; 學完此階段可解決的現實問題: 搭建負載均衡、高可靠的伺服器叢集,可以增

一文讓你徹底瞭解卷積神經網路

卷積神經網路(Convolutional Neural Network,CNN)是一種前饋神經網路,它的人工神經元可以響應一部分覆蓋範圍內的周圍單元,對於大型影象處理有出色表現。 它包括卷積層(convolutional layer)和池化層(pooling layer)。 對比:卷積神經網路、

一篇文章讓你徹底瞭解Java內部類

內容整理自《Thinking in Java》(第四版) 第10章 PDF下載地址 什麼是內部類? 將一個類的定義,放在另一個類的定義內部,那這個類,就是內部類 為什麼需要內部類? 一般來說,內部類繼承自某個類或實現某個介面,內部類的程式碼操作建立其的

五分鐘讓你徹底瞭解TDD、ATDD、BDD&RBE

在目前比較流行的敏捷開發模式(如極限程式設計、Scrum方法等)中,推崇“測試驅動開發(Test Driven Development,TDD)”——測試在先、編碼在後的開發實踐。TDD有別於以往的“先編碼、後測試”的開發過程,而是在程式設計之前,先寫測試指令碼或設計測試用例

一篇文章徹底瞭解清楚什麼是負載均衡

負載均衡是高可用網路基礎架構的的一個關鍵組成部分,有了負載均衡,我們通常可以將我們的應用伺服器部署多臺,然後通過負載均衡將使用者的請求分發到不同的伺服器用來提高網站、應用、資料庫或其他服務的效能以及可靠性。 為什麼要引入負載均衡 先看一個沒有負載均衡機制的web架

一篇文章徹底瞭解小程式

小程式 基礎知識 小程式實現原理 微信 iOS 執行在 webkit(蘋果開源的瀏覽器核心),Android 執行在 X5(QQ瀏覽器核心)。 支付寶 小程式呼叫系統的 API 小程式的架構 小程式與 Andro

徹底瞭解Restful

原文:https://blog.csdn.net/chenxiaochan/article/details/73716617 原文作者寫的極好簡單清晰,所以忍不住拿來學習一下,↑ 面為作者原文 REST是英文representational state transfer(表象性狀態轉變)或者

【Restful】三分鐘徹底瞭解Restful最佳實踐

         REST是英文representational state transfer(表象性狀態轉變)或者表述性狀態轉移;Rest是web服務的一種架構風格;使用HTTP,URI,XML,JSON,HTML等廣泛流行的標準和協議;輕量級,跨平臺,跨語言的架構設計;

[Android] 徹底瞭解Binder機制原理和底層實現

1.Binder通訊機制介紹 這篇文章會先對比Binder機制與Linux的通訊機制的差別,瞭解為什麼Android會另起爐灶,採用Binder。接著,會根據 Binder的機制,去理解什麼是Service Manager,在C/S模型中扮演什麼角色。最後,會從一次完整的通訊活動中,去理解Binder通訊

徹底瞭解Binder機制原理和底層實現

轉載地址: http://www.2cto.com/kf/201606/515548.html http://www.2cto.com/kf/201606/515548.html 1.Binder通訊機制介紹 這篇文章會先對比Binder機制與Linux的通訊機制的

幫 C/C++ 程式設計師徹底瞭解連結器

本文旨在幫助 C/C++ 程式設計師們瞭解連結器到底完成了些什麼工作。多年來,我給許多同事解釋過這一原理,因此我覺得是時候把它寫下來了,這樣不僅可以供更多人學習,也省去我一遍遍講解。 [2009年3月更新,內容包括:增加了 Windows 系統中連結過程可能遇到

一文讓你徹底瞭解iOS字型相關知識

作者:董鉑然 授權本站轉載。 寫本文的契機主要是把自己整理的關於iOS字型方面的知識不斷更新寫在這篇博文中,用來自己以後查閱。 一、iOS原生字型展示 在label中選擇字型的font,並把font由system改成custom後,就能在family中看到72種特殊

徹底瞭解DVD:從入門到精通

第五章 拿什麼來看DVD?    前文探討了DVD光碟片的相關常識,本章聊一聊DVD的周邊裝置。  DVD的周邊裝置無外乎音訊裝置(聲音)和視訊裝置(顯示)。這章內容涉及很多,從音響到電視到DVD機,凡是與DVD周邊裝置有關的都帶了出來,以求得到全面而確實的概念,以助於理解下一章要談的千變萬化的D版DVD畫質

HashMap原始碼分析(二):看完徹底瞭解HashMap

上文講到HashMap的增加方法,現在繼續 上文連結 HashMap在上一篇原始碼分析的文章中,如果使用put的時候如果元素數量超過threshold就會呼叫resize進行擴容 1.擴容機制 想要了解HashMap的擴容機制你要有這兩個問題 1.什麼時候才需要擴容 2.HashMap的擴容是什麼 在

安卓JNI精細化講解,讓你徹底瞭解JNI(一):環境搭建與HelloWord

目錄 1、基礎概念 ├──1.1、JNI ├──1.2、NDK ├──1.3、CMake與ndk-build 2、環境搭建 3、Native C++ 專案(HelloWord案例) ├── 3.1、專案建立(java、kotlin) ├── 3.2、CMake的應用(詳細講解) ├── 3.3、ndk-bui