一起使用 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());

因为现在感觉它只是一个表示它不存在的标记值。

是否有关于使用 MonoOptional 的模式的指导?当你真的想表达不存在的东西时,有没有正确的方法来完全抛弃 Optional

我开始在一个小项目中使用 webflux,我们遇到了同样的问题。我们决定 return Mono<Order> 大多数时候,我们然后使用 switchIfEmpty(Mono<? extends T> alternate) 来抛出错误或使用替代方法恢复

在我们的用例中 switchIfEmpty()defaultIfEmpty() 给了我们足够的控制权来处理空结果。

参考指南中的示例:https://projectreactor.io/docs/core/release/reference/index.html#_checking_the_execution_path_with_code_publisherprobe_code