使用 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
是否有更好的实用方法来实现这一目标?
ifPresentOrElse
returnsvoid
。您可能想要的是 map
和 orElseGet
:
的组合
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()
。
我正在努力解决当前面临的问题。
我有一个函数 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
是否有更好的实用方法来实现这一目标?
ifPresentOrElse
returnsvoid
。您可能想要的是 map
和 orElseGet
:
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()
。