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

在RXJava中什么时候使用map vs flatMap?

詹唯
2023-03-14

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

使用映射,我们必须以某种方式处理异常。但怎么做呢?:

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链中,如果我们选择其他地方,甚至重试,就可以处理错误:

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的错误处理(而不是冗长)。我还没有看到任何关于这方面的最佳实践,我很好奇这在实践中是如何使用的。

共有1个答案

茅鸿宝
2023-03-14

map将一个事件转换为另一个事件。flatmap将一个事件转换为零个或多个事件。(本文摘自IntroToRx)

当您想要将json转换为对象时,使用map应该就足够了。

处理FileNotFoundException是另一个问题(使用map或flatmap不能解决这个问题)。

要解决您的异常问题,只需用非检查异常抛出它:RX将为您调用onError处理程序。

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) {
            // this exception is a part of rx-java
            throw OnErrorThrowable.addValueAsLastCause(e, file);
        }
    }
});

与flatmap完全相同的版本:

Observable.from(jsonFile).flatMap(new Func1<File, Observable<String>>() {
    @Override public Observable<String> call(File file) {
        try {
            return Observable.just(new Gson().toJson(new FileReader(file), Object.class));
        } catch (FileNotFoundException e) {
            // this static method is a part of rx-java. It will return an exception which is associated to the value.
            throw OnErrorThrowable.addValueAsLastCause(e, file);
            // alternatively, you can return Obersable.empty(); instead of throwing exception
        }
    }
});

在flatMap版本中,您还可以返回一个新的可观察值,它只是一个错误。

Observable.from(jsonFile).flatMap(new Func1<File, Observable<String>>() {
    @Override public Observable<String> call(File file) {
        try {
            return Observable.just(new Gson().toJson(new FileReader(file), Object.class));
        } catch (FileNotFoundException e) {
            return Observable.error(OnErrorThrowable.addValueAsLastCause(e, file));
        }
    }
});
 类似资料:
  • 问题内容: 什么时候在 RxJava中* 使用vs ? * 举例来说,假设我们要将包含JSON的文件映射到包含JSON的字符串中, 使用,我们必须以某种方式处理。但是如何? 使用,它更加冗长,但是如果我们选择其他地方甚至重试,我们可以将问题转发到链的下方并处理错误。 我喜欢的简单性,但是喜欢的错误处理(不是冗长)。我还没有看到关于此的最佳实践,并且很好奇在实践中如何使用它。 问题答案: 将一个事件

  • 我不知道在Android中使用RxJava和从Android体系结构组件中使用LiveData的原因,如果以代码的形式解释两者之间的差异,并提供示例,将会非常有帮助。

  • 问题内容: 奇怪的是: 似乎或多或少被定义为。通过这种方式很容易产生错误: 一些fname意外地以else块结尾。修复很简单,我们应该改用它,但是从表面上看,这似乎是一种不错的pythonic方式,并且比“正确”的方式更具可读性。 由于字符串是不可变的,所以为什么字符串错误是什么技术细节?什么时候进行身份检查更好,什么时候进行平等检查更好? 问题答案: 据我所知,检查对象身份是否相等。由于没有强制

  • 而使用简单的回调实现则类似于如下所示: 这是非常简单和直接的。使用,它很快就变得冗长和复杂。 但事实并非如此。你还是要做这样的事情: 我是不是漏了什么?还是使用s是一个错误的情况?什么时候/应该更喜欢而不是简单回调? 正如@Niels在他的答案中或在Jake Wharton的示例项目U2020中所示,使用改型比上面的示例简单得多。但本质上,问题是一样的--什么时候该用这样或那样的方法?

  • 问题内容: 我有一个将客户发送到另一个站点来处理付款的应用程序。客户之外的另一个站点在我们的服务器上调用一个页面,让我们知道付款的状态。被调用页面会检查付款应用程序提供的参数,并检查我们是否知道该交易。然后,它更新数据库以反映状态。这一切都无需与客户进行任何互动即可完成。 我个人选择将此功能实现为JSP,因为将文件拖放到文件系统中比编译和打包文件然后将条目添加到配置文件中要容易得多。 考虑到页面的

  • 问题内容: 我怎么能说: 为什么函数调用中不需要括号,而最后一行呢? 问题答案: 是一个功能 调用该函数并产生该函数返回的任何值。 setTimeout的目的是在一段时间后运行代码。你需要的功能只是传递给它(这样的setTimeout可以自称在适当的时候函数),因为如果你将它传递给setTimeout的前调用的函数(用括号),将执行 现在 而不是1秒后,。