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.................flatmap6concatMap
上面其实就说了,
concatMap
与FlatMap
的唯一区别就是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"); } });