首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在RxJava中,什么时候使用map和flatMap?

在RxJava中,什么时候使用map和flatMap?
EN

Stack Overflow用户
提问于 2014-04-04 03:26:03
回答 11查看 121.6K关注 0票数 192

什么时候在RxJava中使用mapflatMap

例如,我们希望将包含JSON的文件映射到包含JSON的字符串--

使用map,我们必须以某种方式处理Exception。但是如何做到呢?:

代码语言:javascript
复制
Observable.from(jsonFile).map(new Func1<File, String>() {
    @Override public String call(File file) {
        try {
            return new Gson().toJson(new FileReader(file), Object.class);
        } catch (FileNotFoundException e) {
            // So Exception. What to do ?
        }
        return null; // Not good :(
    }
});

使用flatMap,它要冗长得多,但如果我们选择其他地方,甚至重试,我们可以沿着Observables链向下转发问题并处理错误:

代码语言:javascript
复制
Observable.from(jsonFile).flatMap(new Func1<File, Observable<String>>() {
    @Override public Observable<String> call(final File file) {
        return Observable.create(new Observable.OnSubscribe<String>() {
            @Override public void call(Subscriber<? super String> subscriber) {
                try {
                    String json = new Gson().toJson(new FileReader(file), Object.class);

                    subscriber.onNext(json);
                    subscriber.onCompleted();
                } catch (FileNotFoundException e) {
                    subscriber.onError(e);
                }
            }
        });
    }
});

我喜欢map的简单性,但喜欢flatmap的错误处理(而不是冗长)。我还没有看到任何关于这方面的最佳实践,我很好奇这是如何在实践中使用的。

EN

Stack Overflow用户

发布于 2017-07-07 01:29:07

这是一个简单的经验法则,我用它来帮助我决定在Rx的Observable中何时使用flatMap()而不是map()

一旦您决定要使用map转换,您就会编写转换代码来返回某个对象,对吧?

如果您作为转换的最终结果返回的内容是:

  • a不可观察的对象,那么您将只使用map(). map()将该对象包装在一个可观察的对象中,并发出it.
  • an Observable flatMap().对象,然后您将使用map()然后flatMap()打开可观察对象,选择返回的对象,用它自己的可观察对象包装它,然后发出它。

例如,我们有一个方法titleCase(String inputParam),它返回输入参数的大小写字符串对象。此方法的返回类型可以是StringObservable<String>

如果titleCase(..)的返回类型仅仅是String,那么你应该使用map(s -> titleCase(s))

  • If,如果String的返回类型是Observable<String>,那么你应该使用flatMap(s -> titleCase(s))

希望能澄清这一点。

票数 23
EN
查看全部 11 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22847105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档