我是RxJava的新手,经常被平面图函数弄糊涂。根据文档,平面图将可观察对象发出的项目转换为可观察对象,然后将这些项目的排放平面化为单个可观察对象
有人能给出一个很好的用例吗?为什么要将原来的可观察对象转换为可观察对象(复数),然后将它们转换为单个可观察对象。
你为什么不直接用“地图”呢?
如果你举一个Android的例子,那就太棒了,否则纯Java就足够了。谢谢
我经常使用它将一些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和后台进程之间的交互。我使用错误处理错误,然后使用错误恢复下一步(可观察)。
您可以在我的文章中找到完整的代码示例。
假设你有一个
Observable<Foo> fooObservable;
并且您想调用另一个方法,该方法采用Foo
并发出可观察的
类似于:
public Observable<Bar> getBars(Foo foo);
如果您这样做了:
fooObservable.map(foo -> getBars(foo));
你最终会得到一个
可观察的
相反,您可以使用“展平可观察对象”的平面图:
Observable<Bar> barObservable = fooObservable.flatMap(foo -> getBars(foo));
我在你的问题上看到了标签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
在闪光灯下,平面图也可以发出一条记录。似乎平面图可以代替地图。有人能告诉我这种情况下的区别吗?谢谢你。