上一篇:RxJava 源碼學習之變換操作符
Filter
-
作用分析
Filter操作符使用你指定的一個謂詞函數測試數據項,只有通過測試的數據才會被發射。
Paste_Image.png
-
代碼示例
Observable.just(1, 2, 3, 4, 5)
.filter(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer item) {
return( item < 4 );
}
}).subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer item) { System.out.println("Next: " + item);}
@Override
public void onError(Throwable error) { System.err.println("Error: " + error.getMessage()); }
@Override
public void onCompleted() { System.out.println("Sequence complete."); }});
//######################################################
輸出結果:
Next: 1
Next: 2
Next: 3
Sequence complete.
Take
-
作用分析
Take只返回前面的N項數據,然后發射完成通知,忽略剩余的數據。
注意:TakeLast只發射最后的N項數據
Paste_Image.png
-
示例代碼
//測是代碼:
/** * 只返回前面 2個數據 */
Observable.just(1, 2, 3, 4, 5)
.take(2)
.subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer item) { System.out.println("Next: " + item); }
@Override
public void onError(Throwable error) { System.err.println("Error: " + error.getMessage()); }
@Override
public void onCompleted() { System.out.println("Sequence complete."); }});
//####################################
輸出結果:
Next: 1
Next: 2
Sequence complete.
TakeLastBuffer
-
作用分析
takeLastBuffer和TakeLast類似,,唯一的不同是它把所有的數據項收集到一個List再發射,而不是依次發射一個。
Paste_Image.png
-
示例代碼
Observable.just(1, 2, 3, 4, 5)
.takeLastBuffer(3)
.subscribe(new Subscriber<List<Integer>>() {
@Override
public void onError(Throwable error) { System.err.println("Error: " + error.getMessage()); }
@Override
public void onCompleted() { System.out.println("Sequence complete."); }
@Override
public void onNext(List<Integer> integers) {
System.out.print("onNext: ");
for (int i = 0; i < integers.size(); i++) {
System.out.print(integers.get(i));
if(i != integers.size() - 1){
System.out.print(",");
}
}
System.out.println();
}
});
//##################################
輸出結果:
onNext: 3,4,5
Sequence complete.
Skip
-
作用分析
Skip 可以忽略Observable發射的前N項數據,只保留之后的數據。
注意:SkipLast忽略Observable發射的后N項數據,只保留之前的數據。
Paste_Image.png
-
示例代碼
/** * 跳過前面 2個數據 */
Observable.just(1, 2, 3, 4, 5)
.skip(2)
.subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer item) { System.out.println("Next: " + item); }
@Override
public void onError(Throwable error) { System.err.println("Error: " + error.getMessage()); }
@Override
public void onCompleted() { System.out.println("Sequence complete."); } });
//########################################
輸出結果:
Next: 3
Next: 4
Next: 5
Sequence complete.
ElementAt
-
作用分析
ElementAt操作符獲取原始Observable發射的數據序列指定索引位置的數據項,然后當做自己的唯一數據發射。
注意:elementAtOrDefault與elementAt的區別是,如果索引值大于數據項數,它會發射一個默認值(通過額外的參數指定),而不是拋出異常。但是如果你傳遞一個負數索引值,它仍然會拋出一個IndexOutOfBoundsException異常。
Paste_Image.png
-
示例代碼
Observable.just(1, 2, 3, 4, 5)
.elementAt(2)
.subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer item) { System.out.println("Next: " + item); }
@Override
public void onError(Throwable error) { System.err.println("Error: " + error.getMessage()); }
@Override
public void onCompleted() { System.out.println("Sequence complete."); } });
//##################################
輸出結果:
Next: 3
Sequence complete.
Distinct
-
作用分析
Distinct過濾掉重復的數據項
Paste_Image.png
-
示例代碼
Integer[] nums = {1,1,2,3,1,5,2,3,7,4};
Observable.from(nums)
.distinct()
.subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer item) { System.out.println("Next: " + item); }
@Override
public void onError(Throwable error) { System.err.println("Error: " + error.getMessage()); }
@Override
public void onCompleted() { System.out.println("Sequence complete."); } });
//###########################################
輸出結果:
Next: 1
Next: 2
Next: 3
Next: 5
Next: 7
Next: 4
Sequence complete.
參考文檔
結束語
ok,RxJava之過濾操作符已經學習完啦,當然這里都是分析一些常用的,想了解更多的操作符就去看RxJava官方文檔吧。
下一篇:RxJava 源碼學習之組合操作符