我正试图获得一对:
Pair<User,List<Messages>>
我阅读了这篇文章:RxJava patterns
我基本上尝试先吸引用户。然后,一旦有了用户,我就想要获取该用户的所有消息:
mDisposable.add(
userViewModel.getUser(id)
.flatMap(user -> messagesViewModel.getFromUser(user.getId()),(user, messages) -> new Pair<>(user, messages)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(//update view based on user and messages);
代码不起作用,它抱怨传递给flatmap的参数。
userViewModel.getUser(id)
返回一个Single<User>
messagesViewModel.getFromUser(user.getId())
返回一个Single<List<Message>>
flatmap的rx文档和方法定义非常混乱。我该如何实现?还是有另一种方法可以做到这一点?
有趣的是,它似乎可以与Observable一起使用:
mDisposable.add(
Observable.just(1)
.flatMap(item -> Observable.just(2), Pair::new)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe());
答案 0 :(得分:1)
根据文档,Observable
具有flatMap()
功能,其签名类似
public final <U,R> Observable<R> flatMap(Function<? super T,? extends ObservableSource<? extends U>> mapper,
BiFunction<? super T,? super U,? extends R> resultSelector)
这正是您在最新情况下使用的。但是Single
只有flatMap()
带有签名,例如
public final <R> Single<R> flatMap(Function<? super T,? extends SingleSource<? extends R>> mapper)
这就是为什么您不能直接使用它的原因。如果您仍然想使用Single
来解决问题,则可以使用下一个表达式
userViewModel.getUser(id)
.flatMap(user -> messagesViewModel.getFromUser(user.getId())
.map(messages -> new Pair<>(user, messages)))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())