gpt4 book ai didi

android - RxJava 将两种不同类型的 observable 组合成第三种类型的 observable

转载 作者:行者123 更新时间:2023-11-29 01:16:25 27 4
gpt4 key购买 nike

我有两个服务器端点。端点 1 使用用户名和密码并返回一个 ID。端点 2 接受一个 that 并返回一个 UserProfile 对象。

我正在尝试编写一个将用户名和密码作为参数并返回 Observable<User> 的方法(其中 User 是一个对象,由一个字段作为端点 1 的 ID 和另一个字段作为 UserProfile 组成)。

我已经弄清楚如何调用我的第一个端点并将生成的 id 作为第二个端点的输入,但是我仍然坚持如何使用来自第二个端点的响应和来自第一个端点的响应创建用户对象并返回它。

这是不正确的,但这是我能够取得的最大进展:

    public Observable<UserProfile> login(String u, String p) {
return mNetworkApi.establishSessionViaCreds(u, p)
.flatMap(s -> mNetworkApi.getUserProfile(s));
}

此方法接受两个字符串并输出一个 Observable<UserProfile> .我需要它来输出一个 Observable。可以通过获取第一个可观察对象 (String) 的输出和第二个可观察对象 (UserProfile) 的输出来创建用户。但是我该怎么做呢?下面是我想要的方法签名,但没有创建 Observable 的正确代码。

public Observable<User> login(String username, String password) {
mNetworkApi.doLogin(username, password)
flatMap((Func1<String, Observable<?>>) s -> mNetworkApi.getUserProfile(s));
/..Code to transform observable.../
return ...;
}

有没有一种方法可以从两种不同类型(String 和 UserProfile)的 Observable 创建第三种类型(User)的 Observable?

编辑为了解释我有更好的问题。第一个 observable 返回一个字符串。该字符串用作下一个 observable 的输入,但是在第二个 observable 运行后,我需要访问第一个 observable 中的字符串并且不再可以获得对它的引用。

编辑这是我能得到的最接近的,但由于无法访问“id”,它仍然无法工作。如果我可以获得对 id 的引用,那么这将完美运行,但我调用了 new User(id, userProfile),id 变量不可访问。

    @Override
public Observable<User> loginUser(String username, String password) {
Observable<String> observableUsername = Observable.just(username);
Observable<String> observablePassword = Observable.just(password);

Observable<User> userObs = Observable.zip(observableUsername, observablePassword,
(user, pass) ->
mNetworkApi.establishSessionViaCreds(user, pass)
.flatMap(id -> mNetworkApi.getUserProfile(id))
.map(userProfile -> new User(id, userProfile))
).flatMap(new Func1<User, Observable<?>>() {
@Override
public Observable<?> call(User user) {
return Observable.just(new User(id, userProfile));
}
});

return userObs;
}

编辑

Observable<User> userObs = Observable.zip(observableUsername, observablePassword,
(user, pass) ->
mNetworkApi.establishSessionViaCreds(user, pass)
.flatMap(id -> mNetworkApi.getUserProfile(id)
.map(new Func1<UserProfile, User>() {
@Override
public User call(UserProfile userProfile) {
return Observable.just(new User(id, userProfile));
}
})
)
);

最佳答案

有一个 flatMap 的覆盖,它允许您指定一个 Func2 来合并原始输入和 Func1 的输出。对于您的情况,它看起来像:

public Observable<User> login(String u, String p) {

return networkApi
.establishSessionViaCreds(u, p)
.flatMap(
// here is the normal Func1
new Func1<String, Observable<UserProfile>>() {
@Override
public Observable<UserProfile> call(String id) {
return networkApi.getUserProfile(id);
}
},
// here is the extra Func2 which allows the merge
new Func2<String, UserProfile, User>() {
@Override
public User call(String id, UserProfile userProfile) {
return new User(id, userProfile);
}
}
);
}

或者,如果您使用的是 lambda:

public Observable<User> login(String u, String p) {

return networkApi
.establishSessionViaCreds(u, p)
.flatMap(
id -> { return networkApi.getUserProfile(id); },
User::new
);
}

关于android - RxJava 将两种不同类型的 observable 组合成第三种类型的 observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39295539/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com