考虑以下伪代码
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()
因为它基本上是块线程。
提前致谢!
答案 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/