Rxjava常用的操作符

时间:2021-07-23 14:52:49

Rxjava 我也用了有一小段时间了,谈谈感想 书写起来的确很轻松,内涵大量的操作符可以实现几乎你所有的操作,但是标签太多,初学很难记,我简单的总结了一些常用的操作符

在此推荐一个Rxjava的中文文档,对初学者很有用https://mcxiaoke.gitbooks.io/Create.html

Rxjava最好配合lambda一起使用,那样代码看起来会更加美观,最起码看起来逼格也稍稍高一点吧

一下是我的测试代码:

如果你的IDE是Android stuido,你需要做一下如下配置,

1。首先你得保证studio用的jdk是1.8以上

Rxjava常用的操作符

2.AD默认是不支持lambda的使用,不过牛逼的大神们已经帮我们实现了

在build:gradle(project:"projectName")中配置maven库

    buildscript {  
        repositories {  
            mavenCentral()  
        }  
        dependencies {  
            classpath 'me.tatarka:gradle-retrolambda:3.2.4'  
        }  
    }  
      
    allprojects {  
        repositories {  
            mavenCentral()  
        }  
    }  

然后build:gradle(module:app)中做如下配置

apply plugin: 'me.tatarka.retrolambda'  
android {  
    compileSdkVersion 23  
    buildToolsVersion "23.0.3"  
    compileOptions {  
        sourceCompatibility JavaVersion.VERSION_1_8  
        targetCompatibility JavaVersion.VERSION_1_8  
    }  
} 

这样就能支持lambda表达式了 如果不行请参照http://blog.csdn.net/lihenair/article/details/50360924

3.接下来ctrl+shift+F10就能运行单个测试方法了

    package com.sumavision;  
    import org.junit.Test;  
    import java.util.ArrayList;  
    import java.util.List;  
    import java.util.concurrent.TimeUnit;  
    import rx.Observable;  
    import rx.Subscriber;  
    import rx.functions.Action1;  
      
    /** 
     * Created by sharpay on 16-10-18. 
     */  
    public class RxJavaTest {  
        List<Integer> testList;  
        List<String> testCharList;  
        public RxJavaTest(){  
            testList = new ArrayList<>();  
            testCharList = new ArrayList<>();  
            for(int i = 0; i < 9; i++){  
                testList.add(i);  
                testCharList.add(String.valueOf((char)(65 + i)));  
            }  
        }  
    //****************************以下是创建操作***************************  
        /**  
         *  desc  创建一个Observable  
         */  
        @Test  
        public void testCreate(){  
            String str = "Sharpayzara";  
            Observable.create((new Observable.OnSubscribe<String>() {  
                @Override  
                public void call(Subscriber<? super String> subscriber) {  
                    subscriber.onNext(str);  
                }  
            })).subscribe(new Action1<String>() {  
                @Override  
                public void call(String s) {  
                    System.out.println(s);  
                }  
            });  
            //lambda简易表达式  
            Observable.create(subscriber -> subscriber.onNext(str))  
                    .subscribe(result-> System.out.println(result));  
        }  
      
        /** 
         *  desc  创建一个发射指定值的Observable 
         */  
        @Test  
        public void testJust(){  
            Observable.just("222","333") //有多少个参数就发射多少次 如果把几个参数都放到一个list中可用from操作符代替  
                    .subscribe(str -> System.out.println(str));  
        }  
      
      
        /** 
         *  desc  直到有观察者订阅时才创建Observable,并且为每个观察者创建一个新的Observable 
         */  
        @Test  
        public void testDefer(){  
            Observable.defer(() -> Observable.just("testDefer"))  
                    .subscribe(str -> System.out.println(str));  
        }  
      
        /** 
         *  desc  迭代Iterable 
         */  
        @Test  
        public void testFrom(){  
            List<String> list = new ArrayList<>();  
            list.add("http://");  
            list.add("ftp://");  
            Observable.from(list)  
                    .subscribe(url -> System.out.println(url));  
        }  
      
        /** 
         *  desc 延时+间隔循环 创建一个按固定时间间隔发射整数序列的Observable 单位毫秒 
         */  
        @Test  
        public void testInterval(){  
            Observable.interval(1, 3000, TimeUnit.MILLISECONDS) //junit测试不出来  
                    //延时3000 ,每间隔3000,时间单位  
                    .subscribe(i -> System.out.println(i));  
        }  
      
        /** 
         *  desc  定时器 它在一个给定的延迟后发射一个特殊的值 单位毫秒 
         */  
        @Test  
        public void testTimer(){  
            Observable.timer(1 , TimeUnit.MILLISECONDS)    //junit测试不出来  
                    .subscribe(i -> System.out.println(i));  
        }  
      
      
      
        //*************************************以下是变换操作***************************  
        /**  
         *  desc  定期收集Observable的数据放进一个数据包裹,然后发射这些数据包裹,而不是一次发射一个值  
         */  
        @Test  
        public void testBuffer(){  
            Observable.from(testList)  
                    .buffer(3)  
                    .subscribe(input -> System.out.println(input));//默认用[]包裹数据  
        }  
      
        /** 
         *  desc  Map操作符 Observable发射的每一项数据应用一个函数,执行变换操作 
         */  
        @Test  
        public void testMap(){  
            Observable.from(testList)  
                    .map(i -> i + "map")  //返回的是一个发射的值 而不是Observable  
                    .subscribe(str -> System.out.println(str));  
        }  
      
      
        /** 
         *  desc  flatMap操作符 FlatMap将一个发射数据的Observable变换为多个Observables,然后将它们发射的数据合并后放进一个单独的Observable 
         */  
        @Test  
        public void testFlatMap(){  
            Observable.just(testList)  
                    .flatMap(i -> Observable.from(i))  //返回的是一个Observable 而不是发射的值  
                    .flatMap(j -> handData(j))  
                    .subscribe(str -> System.out.println(str));  
      
           /* //实战中的运用 获取第一个栏目下的节目列表名称和评分 
            SumaClient.getRetrofitInstance(PlayerRetrofit.class).getProgramListTopic(SumaClient.getCacheControl(),"ca1z3e") // 返回Observable<ProgramListTopic> 
                    .map(programListTopic -> programListTopic.getItems()) //返回一个栏目列表的list 
                    .flatMap(itemsBeen -> SumaClient.getRetrofitInstance(PlayerRetrofit.class).getProgramListData(itemsBeen.get(0).getId(),itemsBeen.get(0).getName(),1,30)) //根据第一个栏目的id和name获取一页节目列表数据 
                    .map(programListData -> programListData.getItems()) //从返回的json对象中取出节目列表数据 
                    .flatMap(itemsBeen1 -> Observable.from(itemsBeen1)) //遍历节目列表数据 发射带有单个节目数据的Observable 
                    .subscribe(itemsBean -> System.out.println(itemsBean.getName() + itemsBean.getPrompt())); //取出打印出节目名称和评分信息*/  
        }  
      
        /** 
         *  desc  处理数据 
         */  
        public Observable<String> handData(Integer num){  
            return Observable.create(subscriber -> subscriber.onNext(num+"flatmap"));  
        }  
      
        /** 
         *  desc 过滤操作符 只发射通过了谓词测试的数据项 
         */  
        @Test  
        public void testFilter(){  
            Observable.from(testList)  
                    .filter(x -> x > 5)   //即 x -> x > 5?true:false  
                    .subscribe( x -> System.out.println(x));  
           //比方说每隔一周自动清理一次glide的图片缓存  
           Observable.just(context.getSharedPreferences("OneWeek", Context.MODE_PRIVATE)  
                    .getLong("clearCache", System.currentTimeMillis()))  
                    .filter(beforeTime -> (System.currentTimeMillis() - beforeTime)/1000/60/24 > 6)  
                    .doOnNext(x -> saveClearCacheLog())  
                    .observeOn(Schedulers.io())  
                    .subscribe(x ->  Glide.get(context).clearDiskCache());  
      
      }  
      private void saveClearCacheLog(){  
            SharedPreferences preferences = context.getSharedPreferences("OneWeek", Context.MODE_PRIVATE);  
            SharedPreferences.Editor editor = preferences.edit();  
            editor.putLong("clearCache", System.currentTimeMillis());  
            editor.commit();  
        }  
     /** 
         *  desc  只发射第一项(或者满足某个条件的第一项)数据 
         */  
        @Test  
        public void testFirst(){  
            /*Observable.from(testList) 
                    .first() 
                    .subscribe(x -> System.out.println(x));*/  
            Observable.from(testList)  
                    .first(x -> x > 5)  
                    .subscribe(x -> System.out.println(x));  
        }  
      
        /** 
         *  desc  只发射最后项(或者满足某个条件的最后项)数据 
         */  
        @Test  
        public void testLast(){  
            Observable.from(testList)  
                    .last(x -> x < 5)  
                    .subscribe(x -> System.out.println(x));  
        }  
      
        /** 
         *  desc  抑制Observable发射的前N项数据 
         */  
        @Test  
        public void testSkip(){  
            Observable.from(testList)  
                    .skip(2) //丢弃前两项发射的数据  
                    .subscribe(x -> System.out.println(x));  
        }  
      
        /** 
         *  desc  抑制Observable发射的后N项数据 
         */  
        @Test  
        public void testSkipLast(){  
            Observable.from(testList)  
                    .skipLast(2) //丢弃后两项发射的数据  
                    .subscribe(x -> System.out.println(x));  
        }  
      
        /** 
         *  desc  只发生Observable的前N项数据 
         */  
        @Test  
        public void testTake(){ //takeLast同理  
            Observable.from(testList)  
                    .take(2) //只接受前两项发射的数据  
                    .subscribe(x -> System.out.println(x));  
        }  
      
        //****************************以下是合并(多输入 单输出)操作***************************  
        /**  
         *  desc  通过一个函数将多个Observables的发射物结合到一起,基于这个函数的结果为每个结合体发射单个数据项。  
         */  
        @Test  
        public void testZip(){  
            testCharList.add("J");  
            Observable.zip(Observable.from(testList),Observable.from(testCharList),(x,y) -> x+y)  
                    .subscribe(z -> System.out.println(z));  
      
        }  
        /** 
         *  desc  使用Merge操作符你可以将多个Observables的输出合并 
         */  
        @Test  
        public void testMerge(){  
            Observable.merge(Observable.from(testList),Observable.from(testCharList))  
                    .subscribe(z -> System.out.println(z));  
        }  
      
      
        //****************************以下是辅助操作***************************  
        /**  
         *  desc  在序列的开头插入指定的数据序列  
         */  
        @Test  
        public void testStartWith() {  
            Observable.from(testCharList)  
                    .startWith("test")  
                    .subscribe(z -> System.out.println(z));  
      
        }  
      
        /** 
         *  desc  延迟一段指定的时间再发射来自Observable的发射物 
         */  
        @Test  
        public void testDelay(){  
            new Thread(() -> {  Observable.from(testCharList) //看来junit在线程里也测不出来  
                    .delay(1000,TimeUnit.MILLISECONDS)  
                    .subscribe(z -> System.out.println(z));  
            }).start();  
        }  
      
        /** 
         *  desc  仅在过了一段指定的时间还没发射数据时才发射一个数据 
         */  
        @Test  
        public void testDeBounce(){  
            Observable.from(testCharList)  
                    .delay(2,TimeUnit.MILLISECONDS)//每2毫秒发一次  
                    .debounce(10,TimeUnit.MILLISECONDS)//每10毫秒接受一次 a,b,c,d会被丢弃 e通过,  
                    .subscribe(x -> System.out.println(x));  
        }  
        /** 
         *  desc  与debounce类似 作用都是减少函数被调用的次数 它会定期发射这个时间段里源Observable发射的第一个数据 
         */  
        @Test  
        public void testThrottleFirst(){  
            Observable.from(testCharList)  
                    .delay(10,TimeUnit.MILLISECONDS)  
                    .throttleFirst(30,TimeUnit.MILLISECONDS)  //例如用于防止按钮重复点击  
                    .subscribe(z -> System.out.println(z));  
        }  
        /** 
         *  desc  对原始Observable的一个镜像,如果过了一个指定的时长仍没有发射数据,它会发一个错误通知 
         */  
        @Test  
        public void testTimeout(){  
            Observable.from(testCharList)  
                    .delay(10, TimeUnit.MILLISECONDS)  
                    .timeout(5, TimeUnit.MILLISECONDS)  
                    .subscribe(z -> System.out.println(z),error -> System.out.println("error"));  
        }  
      
        /** 
         *  desc  处理数据 不改变数据流 (日志保存等操作) 
         */  
        @Test  
        public void testDoOnNext(){  
            Observable.from(testCharList)  
                    .doOnNext(x -> saveData(x))  
                    .subscribe(y -> System.out.println(y));  
        }  
        private void saveData(String str){  
            //保存数据的操作  
        }  
      
    }   

初学的时候可以保存下来,偶尔过目一下,毕竟都是很好理解的且常用的
要是对你有用 点赞鼓励一下吧 ! Rxjava常用的操作符