首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rx-java2:如何安全地调用flatMapSingle

rx-java2:如何安全地调用flatMapSingle
EN

Stack Overflow用户
提问于 2018-08-06 21:11:32
回答 1查看 959关注 0票数 1

我正在与rx-java2作斗争。基本上,我不能安全地从Maybe“逃脱”到Single,并继续其他项目的逻辑流程。下面是我的简化代码,演示了我的问题:

代码语言:javascript
复制
  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());
  }

为了便于理解,我尝试在需要的地方提供类型。这里的问题是,如果Maybe为空,此行(我猜) .flatMapSingle(Maybe::toSingle)将抛出异常NoSuchItemException,流执行将终止。是否有可能改进我的代码,以便如果缺少Maybe值,流程将跳过此项目并继续执行?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-06 21:29:27

不确定您为什么选择这组错综复杂的运算符。试试这个:

代码语言:javascript
复制
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详细说明了反应式类型之间的类型转换。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51708482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档