RxJava,flatmap的好用例

Tax*_*Noi 4 android rx-java rx-android

我是RxJava的新手,经常被flatMap函数搞糊涂了.根据doc,flatmaptransform the items emitted by an Observable into Observables, then flatten the emissions from those into a single Observable

有人能为它提供一个好的用例吗?为什么将原始的Observable转换为Observables(复数),然后将它们转换为单个Observable.

你为什么不用'地图'?

如果你在Android中给出一个很棒的例子,那么普通的Java就足够了.谢谢

Ale*_*der 23

Android在你的问题上看到了标签.所以,可能你应该熟悉Retrofit.

让我们想象您有两种方法:

public interface FoxreyRestApi {

    @POST("/signin")
    Observable<SignInResponse> signin(@Body SignInRequest request);

    @GET("/user")
    Observable<User> getUser(String accessToken);
}
Run Code Online (Sandbox Code Playgroud)

您想要获取用户数据,但您需要accessToken,返回的是SignInResponse.

你可以这样做:

1).创建你的RestAdapter.

2).一个接一个地查询:

restAdapter.signin(request)
    .flatMap(r -> restAdapter.getUser(r.getAccessToken()))
    .subscribe(user -> {/*User your user*/});
Run Code Online (Sandbox Code Playgroud)


Wil*_*ill 7

假设你有一个

Observable<Foo> fooObservable;
Run Code Online (Sandbox Code Playgroud)

并且你想要调用另一种方法来接受Foo并发出一个Observable<Bar>

就像是:

public Observable<Bar> getBars(Foo foo);
Run Code Online (Sandbox Code Playgroud)

如果你这样做:

fooObservable.map(foo -> getBars(foo));
Run Code Online (Sandbox Code Playgroud)

你最终得到的是Observable<Observable<Bar>>因为你已经改变了你的Foo- > Observable<Bar>这可能不是你想要的.

相反,你可以使用flatMap哪个"展平可观察的":

Observable<Bar> barObservable = fooObservable.flatMap(foo -> getBars(foo));
Run Code Online (Sandbox Code Playgroud)