我正在与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());
}为了便于理解,我尝试在需要的地方提供类型。这里的问题是,如果Maybe为空,此行(我猜) .flatMapSingle(Maybe::toSingle)将抛出异常NoSuchItemException,流执行将终止。是否有可能改进我的代码,以便如果缺少Maybe值,流程将跳过此项目并继续执行?
如果有遗漏的细节,请告诉我,我会提供的。
发布于 2018-08-06 21:29:27
不确定您为什么选择这组错综复杂的运算符。试试这个:
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详细说明了反应式类型之间的类型转换。
https://stackoverflow.com/questions/51708482
复制相似问题