mysql 正则regrx_RxJava(四) concatMap操作符用法详解

concatMap操作符的作用

concatMap操作符和flatMap操作符非常类似。如果对 flatMap操作符 不是很了解可以点击链接去看看我的上一篇博文。下面是concatMap操作符的流程图:

e0d53b0e483e41e5219ba276deadd343.png

concatMap和flatMap最大的区别是concatMap发射的数据集是有序的,flatMap发射的数据集是无序的。

concatMap操作符的用法示例

通过上一篇对flatMap的介绍,我们的例子程序输出的结果是无序的。现在把代码中的flatMap换成concatMap:

Observable.from(Arrays.asList(

"http://www.baidu.com/",

"http://www.google.com/",

"https://www.bing.com/"))

.concatMap(new Func1>() {

@Override

public Observable call(String s) {

return createIpObservableMultiThread(s);

}

})

.observeOn(AndroidSchedulers.mainThread());

// 获取ip

private synchronized Observable createIpObservableMultiThread(final String url) {

return Observable

.create(new Observable.OnSubscribe() {

@Override

public void call(Subscriber super String> subscriber) {

try {

String ip = getIPByUrl(url);

printLog(tvLogs, "Emit Data -> ", url + "->" + ip);

subscriber.onNext(ip);

} catch (MalformedURLException e) {

e.printStackTrace();

//subscriber.onError(e);

subscriber.onNext(null);

} catch (UnknownHostException e) {

e.printStackTrace();

//subscriber.onError(e);

subscriber.onNext(null);

}

subscriber.onCompleted();

}

})

.subscribeOn(Schedulers.io());

}

输出结果:

Emit Data -> 'http://www.baidu.com/->115.239.211.112' , Main Thread:false, Thread Name:RxCachedThreadScheduler-1

Consume Data

Emit Data -> 'http://www.google.com/->216.58.221.132'Main Thread:false, Thread Name:RxCachedThreadScheduler-3

Emit Data -> 'https://www.bing.com/->202.89.233.104' Main Thread:false, Thread Name:RxCachedThreadScheduler-2

Consume Data

Consume Data

输出的结果始终都是baidu/google/bing, 使用的线程都是不同的线程。这也就解决了上篇博客提出的问题:既要是多个线程完成任务,又要保持任务的顺序。

但是出现了一个奇怪的问题:上篇博客我们使用flatMap在多个线程完成任务,有时候顺序是乱的。但是concatMap一开始也是使用一个线程来完成任务,只有先调用flatMap多线程完成任务,然后再调用concatMap才会有多线程。

实验结果表明:如果RxJava有了多个线程,concatMap才会使用多个线程,如果Rxjava里只有一个缓存的线程,concatMap只是用一个线程来执行任务,尽管加上了.subscribeOn(Schedulers.io())代码。然而如果是flatMap加上.subscribeOn(Schedulers.io())代码,每次调用都是多个线程的。这也是flatMap和concatMap的又一个区别。

具体的细节 可以查看代码:github地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值