rxjava observable无阻塞地获取值

时间:2016-12-06 19:53:09

标签: java rx-java observable

考虑以下伪代码

Map<Event, Map<Long, Model>> events = Observable
    .from(events())
    .map(event -> Pair.of(event, bucket
            .async()
            .get(event)
            .map(this::toMap)
    ))
    .map(pair -> Pair.of(pair.getKey(),
            pair.getValue().toBlocking().singleOrDefault(null))) // this blocks thread
    .filter(pair -> pair.getValue() != null)
    .toMap(Pair::getKey, Pair::getValue)
    .toBlocking()
    .single();

有没有办法如何从Obesrvable<Map<Long, Model>>获取值(请参阅代码的注释部分)而不调用toBlocking()因为它基本上是块线程。

提前致谢!

2 个答案:

答案 0 :(得分:2)

.map(...)替换为.flatMap(pair -> pair.getValue().map(value -> Pair.of(pair.getKey(), value)))。这会使值的异步请求变得平坦,然后将密钥映射回它。

答案 1 :(得分:1)

您可以使用merge,subscribeOn和observeOn来实现所需的非阻塞行为:

ls

有很多关于多线程RxJava的问题(因为它并不总是按照你的意愿行事) - 这是一篇关于它是如何工作的好文章:http://www.grahamlea.com/2014/07/rxjava-threading-examples/