代码之家  ›  专栏  ›  技术社区  ›  varnie

rx-java2:如何安全调用flatMapSingle

  •  0
  • varnie  · 技术社区  · 6 年前

    我正在与rx-java2抗争。基本上,我不能从 Maybe Single 并继续其余项的逻辑流。 下面是我的简化代码,演示我的问题:

      public Flowable<Long> run() {
        //let's assume this is my "input" data
        List<UserTask> userTasks;
    
        return Single.just(userTasks)
            .flatMapPublisher(Flowable::fromIterable)
             // userRepository.getUser returns a Maybe<User>
            .map((UserTask ut) -> userRepository.getUser(ut.getName())
                    //search for user
                    //if not found, return a dummy user object
                    .defaultIfEmpty(User.newBuilder().build())
                    //leave dummy user objects only
                    .filter((User u) -> u.getName() == null)
                    //for each dummy user object return a corresponding user task
                    .map(u -> ut)
            )
            .flatMapSingle(Maybe::toSingle)
            .flatMap((UserTask mt) -> {
              // return user related to user task, implementation does not matter
              return Flowable.just(User.newBuilder().build());
            })
            .flatMapSingle(this::saveUser);
      }
    
      private Single<Long> saveUser(User u) {
        return userRepository.saveUser(m).subscribeOn(Schedulers.io());
      }
    

    我试着在需要的地方提供类型以便于理解。 问题是万一 也许 吧 是空的,这行(我想) .flatMapSingle(Maybe::toSingle) 引发异常 NoSuchItemException 流执行终止。是否可以改进我的代码以便 也许 吧 值不存在,流程跳过此项并继续?

    如果有遗漏的细节,请告诉我,我会提供的。

    1 回复  |  直到 6 年前
        1
  •  2
  •   akarnokd    6 年前

    不知道为什么选择这个卷积算子集。试试这个:

    public Flowable<Long> run() {
        //let's assume this is my "input" data
        List<UserTask> userTasks;
    
        return 
        Flowable.fromIterable(userTasks)
         // userRepository.getUser returns a Maybe<User>
        .flatMapMaybe((UserTask ut) -> userRepository.getUser(ut.getName())
                .defaultIfEmpty(User.newBuilder().build())
                .filter((User u) -> u.getName() == null)
                .map(u -> ut)
        )
        .map((UserTask mt) -> {
          // return user related to user task, implementation does not matter
          return User.newBuilder().build();
        })
        .flatMapSingle(this::saveUser);
    }
    
    private Single<Long> saveUser(User u) {
       return userRepository.saveUser(m).subscribeOn(Schedulers.io());
    }
    

    这个 documentation 详细说明反应类型之间的类型转换。