Rxjava學習(過濾Observable)

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章