java - 如何在不使用 block() 的情况下使用 Mono 的返回对象?
问题描述
我正在尝试学习spring webflux。在ReactiveMongoRepository
,我正在尝试检查类别是否已经存在。如果它已经存在,则返回该对象,否则保存并返回新保存的对象。类似于以下的东西。
public Mono<Category> save(Category category) {
final Mono<Category> byId = repository.findById(category.getId());
final Category block = byId.block();
if (block == null) {
return repository.save(new Category(category.getName()));
} else {
return byId;
}
}
我怎么能不使用来做到这一点block()
?
解决方案
如果前一个在没有数据的情况下完成,则使用Mono::switchIfEmpty
它提供了一种替代方法。Mono
只要ReactiveMongoRepository::save
返回Mono
,就可以通过它来生成替代的。
return repository.findById(category.getId())
.switchIfEmpty(repository.save(new Category(category.getName())));
如果ReactiveMongoRepository::findById
返回Mono
带有数据的 a,Mono::switchIfEmpty
则不会调用。
编辑:Mono::defer
与 a 一起使用会使Supplier<Mono>
保存操作在必要时延迟:
.switchIfEmpty(Mono.defer(() -> repository.save(new Category(category.getName()))));
推荐阅读
- java - 带有 Maven 和 IntelliJ 的 OpenJFX 14:无法运行应用程序
- html - 如何在 5 列网格中居中 3 个项目
- java - 在实现 org.springframework.validation.Validator 时随时访问 Headers
- python - 将包含字符串的 RDD[Row] 转换为 IntegerTypes 的 Dataframe
- javascript - 如何在 Express 中验证模式?
- javascript - Angular Kendo UI:在 masktextbox 中显示 X 而不是文本
- api - 如何使用 API IntelliJ 想法将搜索栏与您自己的代码存储库链接?
- ffmpeg - 暂停 ffmpeg 屏幕截图?
- html - 我们如何浏览网页将维护主登录页面的导航栏
- python - 试图从python中的另一个文件中读取数据