RxJava 好难理解的一个 FlatMap 的例子

2020-02-17 00:32:44 +08:00
 maninfog

需求是获取系统所有的文件,代码如下:

  File file = new File(Environment.getExternalStorageDirectory().getPath());
  //定义一个被观察者
  Observable<File> observable = Observable.just(file)
                .flatMap(new Function<File, ObservableSource<File>>() {
                    @Override
                    public ObservableSource<File> apply(@NonNull File file) throws Exception {
                        return listFile(file);
                    }
                });
  //定义一个观察者
  Observer<File> observer = new Observer<File>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(File file) {
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        };
  //订阅
  observable.subscribe(observer);
 }
  //递归文件,
  private Observable<File> listFile(File file) {
        if (file.isDirectory()) {
            Observable<File> ob = Observable.fromArray(file.listFiles())
                    .flatMap(new Function<File, ObservableSource<File>>() {
                        @Override
                        public ObservableSource<File> apply(@NonNull File file) throws Exception {
                            return listFile(file);
                        }
                    });
            return ob;
        } else {
            return Observable.just(file);
        }
}

平时使用FlatMap的例子,都是集合转换为单个元素,按照“平铺”的思路,比较能理解;这里直接FlatMap结合递归,搞得人晕晕的,不知道有没有什么好理解的思路?

3258 次点击
所在节点    Java
5 条回复
secondwtq
2020-02-17 01:13:33 +08:00
递归的每一层都保证把这个 File 下的所有文件“平铺”到一个 Observable 里面
zhuangzhuang1988
2020-02-17 10:03:53 +08:00
搜下 monad, 简单看下就知道了
maninfog
2020-02-17 10:45:45 +08:00
@zhuangzhuang1988 看了一下 更晕了
bydgg
2020-02-17 11:05:22 +08:00
flatten、map 等,不是 rxjava 里专有的。
flatten ( list of list )-> list //个人理解
flatmap = flatten + map
建议把 recursive function 里的 observable 去掉,只剩下 “输入节点,输出 list of 子节点” 的逻辑,再放到 mapper 里。
colaman
2020-03-04 19:34:26 +08:00
用上下游来想象这部分代码,递归的 flatmap 在中游,递归的逻辑让每一个 file 都成了一个 Observable,然后把 file 发射出去,然后再往下游发射

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/645134

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX