如何无需flatMap调用带参数的返回void的Mono方法?
可行方案整理
方案1:用doOnNext处理副作用(最适合你的场景)
doOnNext是Reactor里专门用来执行不影响主数据流的副作用操作的,刚好匹配你要执行save但不需要依赖它返回值的需求。直接把save调用放在doOnNext里,后续用map做对象转换就行:
userRepository.findById(id) .doOnNext(user -> userRepository.save(user)) .map(userMapper::map);
如果你的save是阻塞型的耗时操作,别直接在doOnNext里调用,最好包装到异步线程池里避免阻塞事件循环:
.doOnNext(user -> Mono.fromRunnable(() -> userRepository.save(user)) .subscribeOn(Schedulers.boundedElastic()) .subscribe() )
方案2:用then配合Mono.fromRunnable(需等待save完成时用)
你说then不支持lambda是用法不对,then可以接收lambda表达式来生成后续的流。如果需要确保save执行完再返回映射后的对象,可以这么写:
userRepository.findById(id) .flatMap(user -> Mono.fromRunnable(() -> userRepository.save(user)) .then(Mono.just(userMapper.map(user))) );
不过这个还是用到了flatMap,如果严格不想用flatMap,方案1是最优解。
另外提一句:你原来的代码里直接在flatMap里调用void类型的save,如果save是异步操作的话,会出现不等待保存完成就返回映射对象的问题,用doOnNext或者包装成Mono的方式能更规范地处理这类逻辑。
内容的提问来源于stack exchange,提问作者kylie.zoltan
相关产品推荐
相关产品推荐

