Filtering Observables(過濾Observable)
1、Debounce
僅在過了一段指定的時間還沒發射數據時才發射一個數據
//僅在過了一段指定的時間還沒發射數據時才發射一個數據
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
try {
for (int i = 0; i < 10; i++) {
Thread.sleep(1000);
subscriber.onNext(i);
}
subscriber.onCompleted();
} catch (InterruptedException e) {
e.printStackTrace();
subscriber.onError(e);
}
}
}).debounce(1, TimeUnit.SECONDS).subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
System.out.println("onCompleted():" + "\n");
}
@Override
public void onError(Throwable throwable) {
System.out.println("onError():" + throwable + "\n");
}
@Override
public void onNext(Integer integer) {
System.out.println("onNext:" + integer);
}
});
運行結果:
onNext:1
onNext:9
onCompleted():
2、Distinct
抑制(過濾掉)重複的數據項
Distinct 的過濾規則是:只允許還沒有發射過的數據項通過。
Observable.just(1, 2, 3, 2, 3)
.distinct()
.subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
System.out.println("onCompleted():" + "\n");
}
@Override
public void onError(Throwable throwable) {
System.out.println("onError():" + throwable + "\n");
}
@Override
public void onNext(Integer integer) {
System.out.println("onNext():" + integer + "\n");
}
});
運行結果:
onNext():1
onNext():2
onNext():3
onCompleted():
Observable.just("a", "a", "b", "c", "a", "b")
.distinct()
.subscribe(new Action1<String>() {
@Override
public void call(String integer) {
System.out.println(integer);
}
});
運行結果:
a
b
c
3、ElementAt
只發射第N項數據
Observable.just(2, 3, 4, 5, 6)
.elementAt(3)
.subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
System.out.println("onCompleted():" + "\n");
}
@Override
public void onError(Throwable throwable) {
System.out.println("onError():" + throwable + "\n");
}
@Override
public void onNext(Integer integer) {
System.out.println("onNext():" + integer + "\n");
}
});
運行結果:
onNext():5
onCompleted():
4、Filter
只發射通過了謂詞測試的數據項
private static void filter() {
Observable.just(1, 2, 3, 2, 3)
.distinct().filter(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer integer) {
return integer > 2;
}
}).subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
System.out.println("onCompleted():" + "\n");
}
@Override
public void onError(Throwable throwable) {
System.out.println("onError():" + throwable + "\n");
}
@Override
public void onNext(Integer integer) {
System.out.println("onNext():" + integer + "\n");
}
});
}
運行結果:
onNext():3
onCompleted():
5、First
private static void first() {
Observable.just(9, 2, 3, 2, 3)
.distinct().first().
subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
System.out.println("onCompleted():" + "\n");
}
@Override
public void onError(Throwable throwable) {
System.out.println("onError():" + throwable + "\n");
}
@Override
public void onNext(Integer integer) {
System.out.println("onNext():" + integer + "\n");
}
});
}
運行結果:
onNext():9
onCompleted():
6、IgnoreElements
不會回調onNext()方法,直接調用onCompleted()方法或者onError方法
private static void ignoreElements() {
//不會回調onNext()方法,直接調用onCompleted()方法或者onError方法
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(123);
subscriber.onCompleted();
}
}).ignoreElements().subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
System.out.println("onCompleted():" + "\n");
}
@Override
public void onError(Throwable throwable) {
System.out.println("onError():" + throwable + "\n");
}
@Override
public void onNext(Integer integer) {
System.out.println("onNext:" + integer + "\n");
}
});
}
運行結果:
onCompleted():
7、Last
只發射最後一項(或者滿足某個條件的最後一項)數據
private static void laslt() {
Observable.range(1, 10).last().subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println(integer);
}
});
}
運行結果:
10
8、Sample
採樣
private static void sample() {
//每隔4s纔會向觀察者發送數據
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
try {
for (int i = 0; i < 10; i++) {
Thread.sleep(1000);
subscriber.onNext(i);
}
subscriber.onCompleted();
} catch (InterruptedException e) {
e.printStackTrace();
subscriber.onError(e);
}
}
}).sample(4, TimeUnit.SECONDS).subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
System.out.println("onCompleted():" + "\n");
}
@Override
public void onError(Throwable throwable) {
System.out.println("onError():" + throwable + "\n");
}
@Override
public void onNext(Integer integer) {
System.out.println("onNext:" + integer + "\n");
}
});
}
運行結果:
onNext:2
onNext:6
onNext:9
onCompleted():
9、Skip
抑制Observable發射的前N項數據,使用 Skip 操作符,你可以忽略Observable'發射的前N項數據,只保留之後的數據。
private static void skip() {
Observable.range(1, 10).skip(2).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println(integer);
}
});
}
運行結果:
3
4
5
6
7
8
9
10
10、SkipLast
抑制Observable發射的後N項數據
private static void skipLast() {
Observable.range(1, 10).skipLast(2).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println(integer);
}
});
}
運行結果:
1
2
3
4
5
6
7
8
11、Take
只發射前面的N項數據
private static void take() {
Observable.range(1, 10).take(2).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println(integer);
}
});
}
運行結果:
1
2
12、TakeLast
private static void takeLast() {
Observable.range(1, 10).takeLast(2).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println(integer);
}
});
}
運行結果:
9
10