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
跟我學python之mysql操作詳解 一、查詢操作
在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
JVM之JMM詳解(卷一)
1 序言: 在講解Java的記憶體模型之前,我們可以看看物理機在遇到併發問題時所想出的處理方案(物理機和Java虛擬機器在解決併發問題有不少相似的地方,具有很大的參考價值)。本章旨在剖析Java的記憶體模型以及讓讀者明白Java併發程式設計裡不知其所以然的地方。(推薦
python之celery使用詳解一
前段時間需要使用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++支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數、返回值取得任意型別。 模板是一種對型別進行引數化的工具; 通常有兩種形式:函式模板和類模板; 函式模板針對僅引數型別不同的函式; 類模板針對僅資料成