V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
maninfog
V2EX  ›  Java

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

  •  
  •   maninfog · 2020-02-17 00:32:44 +08:00 · 3116 次点击
    这是一个创建于 1524 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

      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结合递归,搞得人晕晕的,不知道有没有什么好理解的思路?

    5 条回复    2020-03-04 19:34:26 +08:00
    secondwtq
        1
    secondwtq  
       2020-02-17 01:13:33 +08:00   ❤️ 1
    递归的每一层都保证把这个 File 下的所有文件“平铺”到一个 Observable 里面
    zhuangzhuang1988
        2
    zhuangzhuang1988  
       2020-02-17 10:03:53 +08:00   ❤️ 1
    搜下 monad, 简单看下就知道了
    maninfog
        3
    maninfog  
    OP
       2020-02-17 10:45:45 +08:00 via iPhone
    @zhuangzhuang1988 看了一下 更晕了
    bydgg
        4
    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
        5
    colaman  
       2020-03-04 19:34:26 +08:00
    用上下游来想象这部分代码,递归的 flatmap 在中游,递归的逻辑让每一个 file 都成了一个 Observable,然后把 file 发射出去,然后再往下游发射
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2667 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:36 · PVG 23:36 · LAX 08:36 · JFK 11:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.