使用 Optional 的 ifPresentOrElse 方法但 return promise 而不是 void

Using Optional's ifPresentOrElse method but return promise instead of void

我正在努力解决当前面临的问题。

我有一个函数 return 是可选类型(具有一些属性的对象)

其中一个属性是可能存在或不存在的 url。我提取 url 以发出 HTTP 请求

injectedClass.method(tenant.clientKey()).flatMap(optionalProperty ->
                        optionalProperty.ifPresentOrElse(fi -> {
                                Blocking.get(() -> httpClientProvider.withHttpClient((HttpClient httpClient) ->
                                    httpClient.request(URI.create(optionalProperty.webTriggerUrl()), (RequestSpec spec) -> {
                                        LogstashMarker markers = append("webTriggerUrl", fi.webTriggerUrl()).and(append("method", "Post").and(append("behaviour", objectMapper.writeValueAsString(baseDTO))));
                                        logger.debug(markers, "Executed a Post request to something webTriggerUrl");
                                        spec.method(HttpMethod.POST);
                                        spec.getBody().type(HttpHeaderValues.APPLICATION_JSON).text(objectMapper.writeValueAsString(baseDTO), CharsetUtil.UTF_8);

                                        final MutableHeaders headers = spec.getHeaders();
                                        headers
                                                .set(HttpHeaderNames.USER_AGENT, userAgent);

                                        headers.set(CorrelationId.HEADER_NAME, correlationId.id());

                                    })
                            )).then(resp -> logger.info("ok"));
                        }, () -> logger.error("something"))

Blocking.get 带回一个 Promise 并且我在我的代码中得到一个错误,基本上说 ifPresentOrElse 的预期 return 类型应该是无效的而不是 Promise

是否有更好的实用方法来实现这一目标?

ifPresentOrElsereturnsvoid。您可能想要的是 maporElseGet:

的组合
optionalProperty.map(/* code to return a Promise */)
        .orElseGet(() -> /* code to return a Promise that is immediately resolved */);

orElseGet() 的供应商中,您可以放置​​ logger.error 声明。

是的,有很多方法,但如果 Optional 为空,您还必须决定要做什么。目前你想要 return a Promise 如果可选存在,并且 return nothing ("void") 如果它是空的。这不起作用,两个分支的类型必须相同。

您可以只使用 optionalProperty.map() 将原始 Optional 映射到 Optional<Promise>,然后使用 ifPresentOrElse 来使用 Promise 或使用空可选,例如按照您的情况进行记录。

但是您还有一个 higher-level flatMap,我不清楚它是哪种类型。这个平面图是 Promise 吗?然后你 必须 return 一个 Promise 也来自可选的另一个分支,你可以使用 optionalProperty.map(...).orElse( <create empty Promise here> ).

如果您想懒惰地创建空分支(通过 Supplier),请查看 orElseGet() 而不是 orElse()