一起使用 Mono 和 Optional
Using Mono and Optional together
我试图用反应式程序解决的一件事是适当地处理没有结果。
假设我有一个 API 可以选择性地检索用户的最新订单。如果没有找到用户,我想将行为留给调用者。在普通的 java 中,我会这样写:
Optional<Order> getLatestOrder(int userId) { ... }
在 webflux 中,如果等效函数应该返回 Mono<Optional<Order>>
或 Mono<Order>
,我会努力思考。
如果我将 getLatestOrder()
添加到反应流中,如果我发出一个空的单声道,它可能会停止。做这样的事情也感觉很奇怪:
getLatestOrder().defaultIfEmpty(new Order());
因为现在感觉它只是一个表示它不存在的标记值。
是否有关于使用 Mono
和 Optional
的模式的指导?当你真的想表达不存在的东西时,有没有正确的方法来完全抛弃 Optional
?
我开始在一个小项目中使用 webflux,我们遇到了同样的问题。我们决定 return Mono<Order>
大多数时候,我们然后使用 switchIfEmpty(Mono<? extends T> alternate)
来抛出错误或使用替代方法恢复
在我们的用例中 switchIfEmpty()
和 defaultIfEmpty()
给了我们足够的控制权来处理空结果。
我试图用反应式程序解决的一件事是适当地处理没有结果。
假设我有一个 API 可以选择性地检索用户的最新订单。如果没有找到用户,我想将行为留给调用者。在普通的 java 中,我会这样写:
Optional<Order> getLatestOrder(int userId) { ... }
在 webflux 中,如果等效函数应该返回 Mono<Optional<Order>>
或 Mono<Order>
,我会努力思考。
如果我将 getLatestOrder()
添加到反应流中,如果我发出一个空的单声道,它可能会停止。做这样的事情也感觉很奇怪:
getLatestOrder().defaultIfEmpty(new Order());
因为现在感觉它只是一个表示它不存在的标记值。
是否有关于使用 Mono
和 Optional
的模式的指导?当你真的想表达不存在的东西时,有没有正确的方法来完全抛弃 Optional
?
我开始在一个小项目中使用 webflux,我们遇到了同样的问题。我们决定 return Mono<Order>
大多数时候,我们然后使用 switchIfEmpty(Mono<? extends T> alternate)
来抛出错误或使用替代方法恢复
在我们的用例中 switchIfEmpty()
和 defaultIfEmpty()
给了我们足够的控制权来处理空结果。