RxJava将一个可观测分为两个子可观测

RxJava将一个可观测分为两个子可观测,java,android,retrofit,rx-java,rx-android,Java,Android,Retrofit,Rx Java,Rx Android,我对RxJava完全是新手,我花了一整天的时间来理解它,我正在思考如何解决这个问题: 我有一个对象,由reformation获取,它包含两个ArrayLists,我必须以不同的方式处理每个ArrayList。目前看来: apiService.getUser(token).enqueue(new Callback<User>() { @Override public void onResponse(Response<User>

我对
RxJava
完全是新手,我花了一整天的时间来理解它,我正在思考如何解决这个问题:

我有一个对象,由
reformation
获取,它包含两个
ArrayLists
,我必须以不同的方式处理每个ArrayList。目前看来:

apiService.getUser(token).enqueue(new Callback<User>() {
            @Override
            public void onResponse(Response<User> response) {

                final User user = response.body();

                for (Skill s : user.getSkills()) {
                    // process here first ArrayList
                }

                for (OrganizerAction o : user.getOrganizerActions()) {
                    // process here second ArrayList
                }
            }

            @Override
            public void onFailure(Throwable t) {
                t.printStackTrace();
            }
        });
apiService.getUser(token.enqueue)(新回调(){
@凌驾
公共响应(响应){
最终用户=response.body();
对于(技能s:user.getSkills()){
//在此处理第一个ArrayList
}
对于(OrganizerAction o:user.getOrganizerActions()){
//在此处理第二个ArrayList
}
}
@凌驾
失效时的公共无效(可丢弃的t){
t、 printStackTrace();
}
});
更新:

public class User {

    // fields

    @SerializedName("organizer_actions")
    @Expose
    private List<OrganizerAction> mOrganizerActions;

    @SerializedName("skills")
    @Expose
    private List<Skill> mSkills;

    public List<OrganizerAction> getOrganizerActions() {
        return mOrganizerActions;
    }

    public List<Skill> getSkills() {
        return mSkills;
    }
}
公共类用户{
//田地
@SerializedName(“组织者行动”)
@暴露
私人名单组织行动;
@序列化名称(“技能”)
@暴露
私人名单;
公共列表getOrganizerActions(){
返回mOrganizerActions;
}
公共列表getSkills(){
返回mSkills;
}
}
谢谢,

Anton

此答案适用于改装2.0.0-beta版,您似乎正在使用它。另外,您没有给出POJO或服务定义,因此要使用通用GitHub API示例作为指导,请修改以匹配指定的数据

第一步是将服务定义转换为使用
Observable
而不是
Call

public interface GitHubService {
    @GET("/users/{user}")
    Observable<User> getUser(@Path("user") String user);
}
接下来,使用
addCallAdapterFactory
将自定义调用适配器添加到改装生成器中

以通常的方式获得您的服务--

接下来,获取您的observable并在其上调用
缓存
,以创建一个
observable
,它将重播结果。从这个可观察到的,你可以订阅多次,在你的情况下,你可以订阅两次。对于您感兴趣的每种类型的数据,使用函数将
用户
对象转换为特定字段<代码>映射允许您将函数应用于可观察对象中的数据。有关更多详细信息,请参阅。在本例中,我们将生成两条流。
id
login
字段各一个

Observable<User> getUserResult = gitHubService.getUser("octocat").cache(1);

getUserResult.map(new Func1<User, Integer>() {
    @Override
    public Integer call(User user) {
        return user.id;
    }
}).subscribe(new Action1<Integer>() {
    @Override
    public void call(Integer id) {
        Log.d("Stream 1", "id = " + id);
    }
});

getUserResult.map(new Func1<User, String>() {
    @Override
    public String call(User user) {
       return user.login;
    }
}).subscribe(new Action1<String>() {
    @Override
    public void call(String login) {
        Log.d("Stream 2", "login = " + login);
    }
});
而且,与您的问题没有直接关系,但如果您打算在Android中使用RxJava,我建议您在尚未使用RxJava的情况下进行检查。上面的map和subscribe代码,以及一般的Rx代码,对于lambdas来说更加简洁

getUserResult.map(user -> user.id).subscribe(
        id -> { Log.d("Stream 1", "id = " + id); }
);

getUserResult.map(user -> user.login).subscribe(
        login -> { Log.d("Stream 2", "login = " + login); }
);

我非常高兴你的回答比我需要的更清楚!
GitHubService gitHubService = retrofit.create(GitHubService.class);
Observable<User> getUserResult = gitHubService.getUser("octocat").cache(1);

getUserResult.map(new Func1<User, Integer>() {
    @Override
    public Integer call(User user) {
        return user.id;
    }
}).subscribe(new Action1<Integer>() {
    @Override
    public void call(Integer id) {
        Log.d("Stream 1", "id = " + id);
    }
});

getUserResult.map(new Func1<User, String>() {
    @Override
    public String call(User user) {
       return user.login;
    }
}).subscribe(new Action1<String>() {
    @Override
    public void call(String login) {
        Log.d("Stream 2", "login = " + login);
    }
});
compile 'io.reactivex:rxjava:1.0.14'
compile 'com.squareup.retrofit:retrofit:2.0.0-beta1'
compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta1'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta1'
getUserResult.map(user -> user.id).subscribe(
        id -> { Log.d("Stream 1", "id = " + id); }
);

getUserResult.map(user -> user.login).subscribe(
        login -> { Log.d("Stream 2", "login = " + login); }
);