j2e*_*nue 3 rx-java flatmap concatmap
根据这个线程, conCatMap和flatmap仅根据项目的发射顺序而不同.所以我做了一个测试并创建了一个简单的整数流,并希望看到它们将以什么顺序发出.我制作了一个小的可观察量,它将在1-5的范围内取数,并将它们乘以2.简单.
以下是flatmap的代码:
myObservable.flatMap(new Func1<Integer, Observable<Integer>>() {
@Override
public Observable<Integer> call(Integer integer) {
return Observable.just(integer * 2);
}
}).subscribe(new Observer<Integer>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Integer integer) {
Log.v("myapp","from flatMap:"+integer);
}
});
Run Code Online (Sandbox Code Playgroud)
和使用concatMap完全相同的代码:
myObservable.concatMap(new Func1<Integer, Observable<Integer>>() {
@Override
public Observable<Integer> call(Integer integer) {
return Observable.just(integer * 2);
}
}).subscribe(new Observer<Integer>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Integer integer) {
Log.v("myapp","from concatmap:"+integer);
}
});
Run Code Online (Sandbox Code Playgroud)
当我在日志中看到打印时,两者的排序是相同的,为什么?我以为只有concatMap会保留顺序?
你所看到的是巧合.每次flatMap返回一个值时,它都会在与前一个相同的线程上执行.
我修改了你的例子以利用多线程:
Observable.just(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
.flatMap(integer -> Observable.just(integer)
.observeOn(Schedulers.computation())
.flatMap(i -> {
try {
Thread.sleep(new Random().nextInt(1000));
return Observable.just(2 * i);
} catch (InterruptedException e) {
e.printStackTrace();
return Observable.error(e);
}
}))
.subscribe(System.out::println,
Throwable::printStackTrace,
() -> System.out.println("onCompleted"));
Run Code Online (Sandbox Code Playgroud)
我2 * i通过随机延迟推迟每个值以强制不同的顺序.另外,我observeOn(Schedulers.computation())之前已经添加了,所以下一个operator(flatMap)在计算线程池上运行 - 这就是多线程魔术.
这是我为我的示例得到的输出(在Android上):
I/System.out: 6
I/System.out: 4
I/System.out: 12
I/System.out: 14
I/System.out: 8
I/System.out: 2
I/System.out: 16
I/System.out: 20
I/System.out: 10
I/System.out: 18
I/System.out: onCompleted
Run Code Online (Sandbox Code Playgroud)
如果我更换flatMap了后just用concatMap,然后我得到一个正确有序输出.
Thomas Nield写了一篇很棒的文章,并给出了正确的解释.
| 归档时间: |
|
| 查看次数: |
2314 次 |
| 最近记录: |