当前位置: 首页 > 知识库问答 >
问题:

RxJava,平面地图的好用例

子车雅珺
2023-03-14

我是RxJava的新手,经常被平面图函数弄糊涂。根据文档,平面图将可观察对象发出的项目转换为可观察对象,然后将这些项目的排放平面化为单个可观察对象

有人能给出一个很好的用例吗?为什么要将原来的可观察对象转换为可观察对象(复数),然后将它们转换为单个可观察对象。

你为什么不直接用“地图”呢?

如果你举一个Android的例子,那就太棒了,否则纯Java就足够了。谢谢

共有3个答案

方永贞
2023-03-14

我经常使用它将一些UI事件转换为可观察的后台任务:

ViewObservable.clicks(calculateBtn)
    .flatMap(new Func1<OnClickEvent, Observable<Integer>>() {
      @Override
      public Observable<Integer> call(OnClickEvent onClickEvent) {
          return observeBackgroundOperation()
            .observeOn(AndroidSchedulers.mainThread())//interaction with UI must be performed on main thread
            .doOnError(new Action1<Throwable>() {//handle error before it will be suppressed
                @Override
                public void call(Throwable throwable) {
                    progress.setVisibility(View.GONE);
                    calculateBtn.setEnabled(true);
                    Toast.makeText(IOCombineSampleActivity.this, R.string.mix_error_message, Toast.LENGTH_SHORT).show();
                }
            })
            .onErrorResumeNext(Observable.<Integer>empty());//prevent observable from breaking
      }
    })
    .subscribe(new Action1<Integer>() {...});

因为使用可观察很容易定义后台操作,所以我使用平面地图将按钮单击事件转换为“在后台事件中完成的事情”(例如通过Retrofit完成的网络请求),然后观察它们。

请注意,在平面图中可以观察到的可以发出单个值,这是在示例中完成的。

通过这种方式,我以声明方式定义了UI和后台进程之间的交互。我使用错误处理错误,然后使用错误恢复下一步(可观察)。

您可以在我的文章中找到完整的代码示例。

端木存
2023-03-14

假设你有一个

Observable<Foo> fooObservable;

并且您想调用另一个方法,该方法采用Foo并发出可观察的

类似于:

public Observable<Bar> getBars(Foo foo);

如果您这样做了:

fooObservable.map(foo -> getBars(foo));

你最终会得到一个可观察的

相反,您可以使用“展平可观察对象”的平面图:

Observable<Bar> barObservable = fooObservable.flatMap(foo -> getBars(foo));

蒋承教
2023-03-14

我在你的问题上看到了标签Android。因此,您可能应该熟悉改装。

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

public interface FoxreyRestApi {

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

    @GET("/user")
    Observable<User> getUser(String accessToken);
}

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

你可以这样做:

1). 创建您的重新适配器。

2). 逐个执行查询:

restAdapter.signin(request)
    .flatMap(r -> restAdapter.getUser(r.getAccessToken()))
    .subscribe(user -> {/*User your user*/});
 类似资料:
  • 有人能解释一下如何在RxJava中通过平面图运算符传递完整信号吗? 如果flatMap操作符被注释,我可以得到从1到10的数字列表,这意味着toList将收到onComplete信号。但当我想在flatMap中进一步处理数据时,它会消耗一个完整的信号,而我无法得到任何结果。如何通过flatMap操作符传递onComplete信号? 我有以下简单的程序:

  • 假设我有一个返回列表的博客帖子api 从列表创建可观察 将每个可观察拆分为

  • 我已经找到了很多关于RxJava的答案,但我想了解它在Reactor中是如何工作的。 我目前的理解是非常模糊的,我倾向于认为map是同步的,flatMap是异步的,但我不能真正理解它。 以下是一个例子: 我有文件(a

  • 我有一个场景,我需要定期调用一个应用编程接口来检查结果。我使用来创建一个调用应用编程接口的间隔函数。 然而,我有背压的问题。在我下面的例子中,间隔中的每个记号都会创建一个新的单曲。理想的效果是仅在调用尚未进行时调用API 我可以使用过滤器变量来解决这个问题: 但是它看起来像一个黑客解决方案。我已经厌倦了在函数之后应用,但是它没有效果。 有什么建议吗?

  • 问题内容: 我目前的理解非常模糊,我倾向于认为map是同步的,而flatMap是异步的,但是我真的无法解决它。 这是一个例子: 我有文件(a ),我想将其复制到服务器上的某些文件中。 本示例摘自一本书。 我可以将所有更改为to ,反之亦然,一切仍然正常。我不知道有什么区别。 问题答案: 用于同步,非阻塞,一对一转换 用于异步(非阻塞)1-to-N转换 区别在方法签名中可见: 取a 并返回a 取a

  • 在闪光灯下,平面图也可以发出一条记录。似乎平面图可以代替地图。有人能告诉我这种情况下的区别吗?谢谢你。