RX操作符之对Observable发射的数据执行变换操作一(map、flatmap)

本文详细介绍了RxJava中的几种常用操作符,包括map、concatMap、flatMap等,并通过实例展示了它们的功能及用法区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     String[]items = {"just1","just2","just3","just4","just5","just6"};

     Observable<String> myObservable = Observable.fromArray(items)
            .map(new Function<String, String>() {
                @Override
                public String apply(String s) throws Exception {
                    return  mapInfo(s);
                }
            });

     Subject<String> mySubscriber = new Subject<String>() {
        @Override
        public void onSubscribe(Disposable d) {

        }

        @Override
        public void onNext(String value) {
            System.out.println("onNext................."+value);
        }


        @Override
        public void onError(Throwable e) {

        }


        @Override
        public void onComplete() {

        }


        @Override
        protected void subscribeActual(Observer<? super String> observer) {

        }


        @Override
        public boolean hasObservers() {
            return false;
        }


        @Override
        public boolean hasThrowable() {
            return false;
        }


        @Override
        public boolean hasComplete() {
            return false;
        }

        @Override
        public Throwable getThrowable() {
            return null;
        }
    };
      myObservable.subscribe(mySubscriber);
     }

     private String mapInfo(String s){
      return  s+" had mapped;";

    }
    09-05 15:59:20.069 7997-7997/System.out: onNext.................just1 had mapped;
    09-05 15:59:20.069 7997-7997/System.out: onNext.................just2 had mapped;
    09-05 15:59:20.069 7997-799I/System.out: onNext.................just3 had mapped;
    09-05 15:59:20.069 7997-799I/System.out: onNext.................just4 had mapped;
    09-05 15:59:20.069 7997-799 I/System.out: onNext.................just5 had mapped;
    09-05 15:59:20.069 7997-7997I/System.out: onNext.................just6 had mapped;
    三、encode


    encode将一个发射字符串的Observable变换为一个发射字节数组(这个字节数组按照原始字符串中的多字节字符边界划分)的Observable。


    四、byLine

    byLine将一个发射字符串的Observable变换为一个按行发射来自原始Observable的字符串的Observable。



    五、flatmap

    FlatMap操作符使用一个指定的函数对原始Observable发射的每一项数据执行变换操作,这个函数返回一个本身也发射数据的Observable,然后FlatMap合并这些Observables发射的数据,最后将合并后的结果当做它自己的数据序列发射。

    flatmap通过一个函数将原来的数据的每一项进行转换,并将返回的数据进行Observable包装,然后将所有这些Observable转换成一个Observable发射,所执行的结果可能和元数据items中数据的顺序不一致
 
    Integer [] items = {1,2,3,4,5,6};

    Observable<String> myObservable = Observable.fromArray(items)
            .flatMap(new Function<Integer, Observable<String>>() {
                @Override
                public Observable<String> apply(Integer s) throws Exception {
                    return Observable.just(flatMapInfo(s));
                }
            } );

    Subject<String> mySubscriber = new Subject<String>() {

        @Override
        public void onSubscribe(Disposable d) {

        }
        @Override
        public void onNext(String value) {
            System.out.println("onNext................."+value);
        }
        @Override
        public void onError(Throwable e) {

        }
        @Override
        public void onComplete() {
            System.out.println("onCompleted.................");
        }
        @Override
        protected void subscribeActual(Observer<? super String> observer) {

        }
        @Override
        public boolean hasObservers() {
            return false;
        }
        @Override
        public boolean hasThrowable() {
            return false;
        }
        @Override
        public boolean hasComplete() {
            return false;
        }
        @Override
        public Throwable getThrowable() {
            return null;
        }
    };
     myObservable.subscribe( mySubscriber);
}

   private String flatMapInfo(Integer i){
    return "flatmap" + i;

 }
     09-05 16:45:38.749 14845-14845                              System.out: onNext.................flatmap1
     09-05 16:45:38.759 14845-14845                              System.out: onNext.................flatmap2
     09-05 16:45:38.759 14845-14845                              System.out: onNext.................flatmap3
     09-05 16:45:38.759 14845-14845                              System.out: onNext.................flatmap4
     09-05 16:45:38.759 14845-14845                              System.out: onNext.................flatmap5
     09-05 16:45:38.759 14845-14845                              System.out: onNext.................flatmap6
  
  
concatMap

上面其实就说了,concatMapFlatMap 的唯一区别就是 concatMap 保证了顺序,所以,我们就直接把 flatMap 替换为 concatMap 验证吧。

Observable.create(new ObservableOnSubscribe<Integer>() {
    @Override
    public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
        e.onNext(1);
        e.onNext(2);
        e.onNext(3);
    }
}).concatMap(new Function<Integer, ObservableSource<String>>() {
    @Override
    public ObservableSource<String> apply(Integer integer) throws Exception {
        List<String> list = new ArrayList<>();
        for ( int i =0 ;i<3;i++){
            list.add("I am value " + integer);
        }
        int delayTime = (int) (1 + Math.random() * 10);
        return Observable.fromIterable(list).delay(delayTime, TimeUnit.MILLISECONDS);
    }
}).subscribe(new Consumer<String>() {
    @Override
    public void accept(String s) throws Exception {
        Log.e("Rxjava", "flatMap : accept : " + s + "\n");
    }
});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值