代码之家  ›  专栏  ›  技术社区  ›  FraK

Android Room数据库RxJava flatmap链请求

  •  0
  • FraK  · 技术社区  · 7 年前

    我想买一双:

    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文档和方法定义非常混乱。我怎样才能做到这一点?还是有其他方法来实现这一点?

    mDisposable.add(
                    Observable.just(1)
                    .flatMap(item -> Observable.just(2), Pair::new)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe());
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   ConstOrVar    7 年前

    据文献记载,, 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)
    

    这就是为什么你不能随心所欲地直接使用它。如果你还想用 单身

    userViewModel.getUser(id)
        .flatMap(user -> messagesViewModel.getFromUser(user.getId())
                                 .map(messages -> new Pair<>(user, messages)))
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())