1. 程式人生 > >RxJava2總結之操作詳解(一)

RxJava2總結之操作詳解(一)

目錄

建立操作

create

建立一個具有發射能力的Observable 
Observable.create(e -> {
    e.onNext("Love");
    e.onNext("For");
    e.onNext("You!");
    e.onComplete();
}).subscribe(s -> System.out.println(s));

just

只是簡單的原樣發射,可將陣列或Iterable當做單個數據。它接受一至九個引數
Observable.just("Love", "For", "You!")
                .subscribe
(s -> System.out.println(s));

empty

建立一個不發射任何資料但是正常終止的Observable
Observable.empty();

never

建立一個不發射資料也不終止的Observable
Observable.never();

error

建立一個不發射資料以一個錯誤終止的Observable 
Observable.error(new Throwable("O__O"));

timer

在延遲一段給定的時間後發射一個簡單的數字0
Observable.timer(1000, TimeUnit.MILLISECONDS
) .subscribe(s -> System.out.println(s));

range

  • start:起始值
  • count:一個是範 圍的資料的數目。0不傳送 ,負數 異常
Observable.range(5, 3)
        //輸出 5,6,7
        .subscribe(s -> System.out.println(s));

intervalRange

  • start,count:同range
  • initialDelay 傳送第一個值的延遲時間
  • period 每兩個發射物的間隔時間
  • unit,scheduler 額你懂的
Observable.intervalRange(5, 100, 3000, 100,
                TimeUnit.MILLISECONDS, Schedulers.io())
                .subscribe(s -> System.out.println(s));

interval

相當於intervalRange的start=0
period 這個值一旦設定後是不可變化的
//period 以後的美每次間隔 這個值一旦設定後是不可變化的  所以 count方法無效的!
int[] s = new int[]{0};
 Observable.interval(3000, 100 + count(s), TimeUnit.MILLISECONDS, Schedulers.io())
         .subscribe(s2 -> System.out.println(s2));
 private int count(int[] s) {
         int result = s[0] * 1000;
         s[0] = s[0] + 1;
         return result;
 }

defer

直到有觀察者訂閱時才建立Observable,並且為每個觀察者建立一個新的Observable 
Observable.defer(() -> Observable.just("Love", "For", "You!"))
              .subscribe(s -> System.out.println(s));

from系列

fromArray

Integer[] items = {0, 1, 2, 3, 4, 5};
       Observable.fromArray(items).subscribe(
               integer -> System.out.println(integer));

fromCallable

Observable.fromCallable(() -> Arrays.asList("hello", "gaga"))
                .subscribe(strings -> System.out.println(strings))

fromIterable

Observable.fromIterable(Arrays.<String>asList("one", "two", "three"))
             .subscribe(integer -> System.out.println(integer));

fromFuture

Observable.fromFuture(Observable.just(1).toFuture())
               .doOnComplete(() -> System.out.println("complete"))
               .subscribe();

過濾操作

elementAt

只發射第N項資料
<!-- 無預設值版本 -->
 Observable.just(1,2)
            .elementAt(0)
            .subscribe(o -> System.out.print(o ));//結果:1
<!-- 帶預設值的變體版本 -->
Observable.range(0, 10)
//        如果索引值大於資料 項數,它會發射一個預設值(通過額外的引數指定),而不是丟擲異常。
//    但是如果你傳遞一 個負數索引值,它仍然會丟擲一個 IndexOutOfBoundsException 異常。
                .elementAt(100, -100)
                .subscribe(o -> System.out.print(o + "\t"));

IgnoreElements

如果你不關心一個Observable發射的資料,但是希望在它完成時或遇到錯誤終止時收到通知
Observable.range(0, 10)
               .ignoreElements()
               .subscribe(() -> System.out.println("complete")
                       , throwable -> System.out.println("throwable"));

take系列

take

  • 變體 count系列:只發射前面的N項資料
Observable.range(0,10)
               .take(3)
               .subscribe(o -> System.out.print(o + "\t"))
  • 變體 time系列: 發射Observable開始的那段時間發射 的資料
Observable.range(0,10)
          .take(100, TimeUnit.MILLISECONDS)
          .subscribe(o -> System.out.print(o + "\t"));

takeLast

  • 變體 count系列:只發射後面的N項資料
Observable.range(0,10)
                    .takeLast(3)
                    .subscribe(o -> System.out.print(o + "\t"));
  • 變體 time系列: 發射在原始Observable的生命周 期內最後一段時間內發射的資料
Observable.range(0,10)
               .takeLast(100, TimeUnit.MILLISECONDS)
               .subscribe(o -> System.out.print(o + "\t"));

takeUntil

傳送complete的結束條件 當然傳送結束之前也會包括這個值
Observable.just(2,3,4,5)
        //傳送complete的結束條件 當然傳送結束之前也會包括這個值
        .takeUntil(integer ->  integer>3)
        .subscribe(o -> System.out.print(o + "\t"));//2,3,4

takeWhile

當不滿足這個條件 會發送結束 不會包括這個值
Observable.just(2,3,4,5)
        //當不滿足這個條件 會發送結束 不會包括這個值
        .takeWhile(integer ->integer<=4 )
        .subscribe(o -> System.out.print(o + "\t"));//2,3,4

skip系列

skip

  • 變體 count系列:丟棄Observable發射的前N項資料
Observable.range(0,5)
               .skip(3)
               .subscribe(o -> System.out.print(o + "\t"));
  • 變體 time系列:丟棄原始Observable開始的那段時間發 射的資料
Observable.range(0,5)
               .skip(3)
               .subscribe(o -> System.out.print(o + "\t"));

skipLast

  • 變體 count系列:丟棄Observable發射的前N項資料
Observable.range(0,5)
               .skipLast(3)
               .subscribe(o -> System.out.print(o + "\t"));
  • 變體 time系列:丟棄在原始Observable的生命周 期內最後一段時間內發射的資料
Observable.range(0,10)
             .skipLast(100, TimeUnit.MILLISECONDS)
             .subscribe(o -> System.out.print(o + "\t"));

distinct

去重
  • keySelector:這個函式根據原始Observable發射的資料項產生一個 Key,然後,比較這些Key而不是資料本身,來判定兩個資料是否是不同的
Observable.just(1, 2, 1, 2, 3)
            //這個函式根據原始Observable發射的資料項產生一個 Key,
            // 然後,比較這些Key而不是資料本身,來判定兩個資料是否是不同的
            .distinct(integer -> Math.random())
            .subscribe(o -> System.out.print(o + "\t"));
日誌:
原因 key不同 所以當做資料不同處理
1   2   1   2   3
  • 無參版本 就是內部實現了的keySelector通過生成的key就是value本身
Observable.just(1, 2, 1, 2, 3)
             .distinct()
             .subscribe(o -> System.out.print(o + "\t"));
 日誌:
 1   2   3

distinctUntilChanged

(相鄰去重):它只判定一個數據和它的直接前驅是 否是不同的
其他概念與distinct一樣

throttleWithTimeout/debounce

操作符會過濾掉髮射速率過快的資料項
throttleWithTimeout/debounce: 含義相同
如果傳送資料後 指定時間段內沒有新資料的話 。則傳送這條
如果有新資料 則以這個新資料作為將要傳送的資料項,並且重置這個時間段,重新計時。
  Observable.create(e -> {
            e.onNext("onNext 0");
            Thread.sleep(100);
            e.onNext("onNext 1");
            Thread.sleep(230);
            e.onNext("onNext 2");
            Thread.sleep(300);
            e.onNext("onNext 3");
            Thread.sleep(400);
            e.onNext("onNext 4");
            Thread.sleep(500);
            e.onNext("onNext 5");
            e.onNext("onNext 6");
        })
                .debounce(330, TimeUnit.MILLISECONDS)
//                .throttleWithTimeout(330, TimeUnit.MILLISECONDS)
                .subscribeOn(Schedulers.newThread())
                .observeOn(Schedulers.newThread())
                .subscribe(o -> System.out.println(o));//結果 3 4 6

filter

只發射通過了謂詞測試的資料項
Observable.range(0, 10)
        //過濾掉false的元素
        .filter(integer -> integer % 2 == 0)
        .subscribe(o -> System.out.print(o + "\t"));

ofType

ofType 是 filter 操作符的一個特殊形式。它過濾一個Observable只返回指定型別的資料
Observable.just(0, "what?", 1, "String", 3)
             //ofType 是 filter 操作符的一個特殊形式。它過濾一個Observable只返回指定型別的資料。
             .ofType(String.class)
             .subscribe(o -> System.out.print(o + "\t"));

first

只發射第一項(或者滿足某個條件的第一項)數 感覺和take(1) elementAt(0)差不多
Observable.range(0, 10)
          //如果元資料沒有傳送  則有傳送預設值
          .first(-1)
          .subscribe(o -> System.out.print(o + "\t"));

last

只發射最後一項(或者滿足某個條件的最後一項)資料 感覺和takeLast(1)差不多
Observable.empty()
              //如果元資料沒有傳送  則有傳送預設值
              .last(-1)
              .subscribe(o -> System.out.print(o + "\t"));

sample/throttleLast

週期取樣後 傳送最後的資料

throttleFirst

週期取樣 的第一條資料 傳送
注意: 如果是已經被髮送過的 則不會繼續傳送
 Observable.create(e -> {
            e.onNext("onNext 0");
            Thread.sleep(100);
            e.onNext("onNext 1");
            Thread.sleep(50);
            e.onNext("onNext 2");
            Thread.sleep(70);
            e.onNext("onNext 3");
            Thread.sleep(200);
            e.onNext("onNext 4");
            e.onNext("onNext 5");
        })
                .subscribeOn(Schedulers.newThread())
                .observeOn(Schedulers.newThread())
                <!--  結果 : onNext 2 onNext 3    onNext 5    -->
                .sample(200, TimeUnit.MILLISECONDS,Schedulers.newThread())
                <!--  結果 : onNext 2 onNext 3    onNext 5    -->
//                .throttleLast(200, TimeUnit.MILLISECONDS,Schedulers.newThread())
                <!--  結果 : onNext 0 onNext 3    onNext 4    -->
//                .throttleFirst(200, TimeUnit.MILLISECONDS,Schedulers.newThread())
                .subscribe(o -> System.out.print(o + "\t"));

相關推薦

RxJava2總結操作()

目錄 建立操作 create 建立一個具有發射能力的Observable Observable.create(e -> { e.onNext("Love"); e.onNext("For"); e.onNe

跟我學pythonmysql操作 、查詢操作

  在python中,我們使用PyMySQL來操作mysql。   一、安裝PyMySQL:    使用pip進行安裝,命令為:    pip install PyMySQL   二、在進行操作之前,首先要開啟本機的mysql,或者,可以直接連線遠端已經開啟的mysql。

Java8新特性Stream

寫了Lambda表示式的部落格,怎麼能少了對Stream的學習呢!接下來就將我所理解的Stream分享給大家,歡迎指出不足之處... 一、為什麼要使用Stream?Stream是什麼?在Java中該怎麼用呢?        (1)為什麼要使用Str

mysql基礎-資料庫連線、建立、刪除、選擇等基本操作()

一、通過cmd連結到資料庫 或者 彈出: 二、通過cmd建立與刪除database 2.1create database [databasename] ERROR 1007 (HY000): Can’t create database ‘mytest’; database exists 加上IF N

MyBatis總結原理

目錄 1.MyBatis 安裝 2.MyBatis中常見物件及其工作基本過程 2.1 SqlSessionFactory 2.2 SqlSession 2.3 Mapper XML對映檔案 3.作用域(Scope)和生命週期 1.MyBatis 安裝 1.

Android開發學習SQLite

一.SQLite的介紹 1.SQLite簡介  SQLite是一款輕型的資料庫,是遵守ACID的關聯式資料庫管理系統,它的設計目標是嵌入 式的,而且目前已經在很多嵌入式產品中使用了它,它佔用資源非常的低,在嵌入式裝置中,可能只需要幾百K的記憶體就夠了。它能夠支援 Windo

phaser學習總結Tween

前言 在上一章phaser學習總結之phaser入門教程中,我們已經初步入門了phaser,並通過一個案例瞭解了phaser,現在我們需要對phaser中的物件進行講解,本章需要講解的是tween,即phaser中的補間動畫,一起來學習一下吧! 引數詳解 (1):from和to方法 語法: from

【python+selenium的web自動化】- 元素的常用操作()

如果想從頭學起selenium,可以去看看這個系列的文章哦! https://www.cnblogs.com/miki-peng/category/1942527.html ​ **本篇主要內容:1.元素的基本操作;2.等待操作;3.iframe操作;4.alert彈出框** ​ **下篇主要內容

iOS總結-UIView總結()方法

參考https://blog.csdn.net/zeng_zhiming/article/details/73469182 首先要回顧UIView繼承於UIResponder,UIResponder繼承NSObject 畫素轉換      主l

linux零基礎學習Linux sed 命令常用操作

延伸 進行 數據 12px -i 空白 字符串 options 信息 sed是Linux系統中一個很好的文件處理工具,可以對數據進行替換、刪除、新增以及選取等操作,使用起來也十分方面,以下是全面的sed操作介紹。sed命令行格式:sed [options] 'com

大數據入門第十七天——storm上遊數據源 kafka)入門

不同 這也 接受 blog 存儲 發送 records ant post 一、概述   1.kafka是什麽     根據標題可以有個概念:kafka是storm的上遊數據源之一,也是一對經典的組合,就像郭德綱和於謙     根據官網:http://kafka.apa

JVMJMM(卷

1 序言:    在講解Java的記憶體模型之前,我們可以看看物理機在遇到併發問題時所想出的處理方案(物理機和Java虛擬機器在解決併發問題有不少相似的地方,具有很大的參考價值)。本章旨在剖析Java的記憶體模型以及讓讀者明白Java併發程式設計裡不知其所以然的地方。(推薦

pythoncelery使用

前段時間需要使用rabbitmq做寫快取,一直使用pika+rabbitmq的組合,pika這個模組雖然可以很直觀地操作rabbitmq,但是官方給的例子太簡單,對其底層原理了解又不是很深,遇到很多坑,尤其是需要自己寫連線池管理和channel池管理。雖然也有用過celery,一直也是celery+redis

嵌入式C語言操作

1.位操作符:     位操作直接將兩個運算元按照二進位制對應進行操作;     例:0xaa&(位與)0xf0=0xa0;     邏輯操作是  兩個運算元整體來操作;     例

iOS狂暴路--兩種佈局方式操作(xib檔案和程式碼編寫)

一、前言 在Android中我們進行佈局操作也是有兩種方式,一種是直接手寫xml佈局,還有一種就是用程式碼編寫,在iOS中其實也是類似,有兩種方式一種是xib檔案,一種程式碼編寫。本文就來介紹iOS開發中最麻煩的最常用的知識佈局內容。有了這些知識之後結合之前的講解的網路和多

docker系列<>docker安裝

1、Docker 要求 CentOS 系統的核心版本高於 3.10 ,檢視本頁面的前提條件來驗證你的CentOS 版本是否支援 Docker 。 通過 uname -r 命令檢視你當前的核心版本 $ uname -r 2、使用 root 許可權登入 Centos。確保 yum 包更新到最新。 $ su

死磕Netty原始碼記憶體分配()(PooledByteBufAllocator)

前言 為了避免頻繁的記憶體分配給系統帶來負擔以及GC對系統性能帶來波動,Netty4使用了記憶體池來管理記憶體的分配和回收,Netty記憶體池參考了Slab分配和Buddy分配思想。Slab分配是將記憶體分割成大小不等的記憶體塊,在使用者執行緒請求時根據請求的

死磕Netty原始碼Reactor執行緒模型()NioEventLoop的啟動

前言 Netty中最核心的就是Reactor執行緒,對應Netty中的程式碼就是NioEventLoop。NioEventLoop是通過NioEventLoopGroup進行維護的,所以在介紹NioEventLoop前我們先介紹一下NioEventLoopGr

C#詞法分析器詞法分析的使用()

雖然文章的標題是詞法分析,但首先還是要從編譯原理說開來。編譯原理應該很多人都聽說過,雖然不一定會有多麼瞭解。 簡單的說,編譯原理就是研究如何進行編譯——也就如何從程式碼(*.cs 檔案)轉換為計算機可以執行的程式(*.exe 檔案)。當然也有些語言如 JavaScrip

C++模板

C++模板   模板是C++支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數、返回值取得任意型別。   模板是一種對型別進行引數化的工具;   通常有兩種形式:函式模板和類模板;   函式模板針對僅引數型別不同的函式;   類模板針對僅資料成