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