需求是获取系统所有的文件,代码如下:
  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结合递归,搞得人晕晕的,不知道有没有什么好理解的思路?
|  |      1secondwtq      2020-02-17 01:13:33 +08:00  1 递归的每一层都保证把这个 File 下的所有文件“平铺”到一个 Observable 里面 | 
|  |      2zhuangzhuang1988      2020-02-17 10:03:53 +08:00  1 搜下 monad, 简单看下就知道了 | 
|      3maninfog OP @zhuangzhuang1988 看了一下 更晕了 | 
|      4bydgg      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 里。 | 
|      5colaman      2020-03-04 19:34:26 +08:00 用上下游来想象这部分代码,递归的 flatmap 在中游,递归的逻辑让每一个 file 都成了一个 Observable,然后把 file 发射出去,然后再往下游发射 |