在 RxJava 中,何时使用 map 和 flatMap?

196

RxJava中,何时使用mapflatMap

例如,我们想将包含JSON的文件映射为包含该JSON的字符串——

使用map时,必须处理Exception。但是如何处理呢?:

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的错误处理更好(并不是因为它更啰嗦)。我还没有看到任何关于此的最佳实践,我很好奇实际上这是如何被使用的。

11个回答

0

Flatmap将可观察对象映射到可观察对象。 Map将项目映射到项目。

Flatmap更加灵活,但Map更加轻量级和直接,所以它有点取决于您的用例。

如果您正在执行任何异步操作(包括切换线程),则应使用Flatmap,因为Map不会检查消费者是否已被处理(这是轻量级的一部分)


可怕的回答。 - madhairsilence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接