![](/img/trans.png)
[英]How can I return a boolean value with Optional's ifPresentOrElse?
[英]Using Optional's ifPresentOrElse method but return promise instead of void
我正在努力解决我面临的当前问题。
我有一个返回 Optional 类型的 function(具有一些属性的 object)
其中一个属性是 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
的预期返回类型应该是 void 而不是 Promise
有没有一种功能更好的方法来实现这一目标?
是的,有很多方法,但是如果Optional
为空,您还必须决定要做什么。 当前,如果存在可选项,您希望返回Promise
,如果为空,则不返回任何内容(“void”)。 这是行不通的,两个分支的类型必须相同。
你可以只使用optionalProperty.map()
到 map 你原来的Optional
到Optional<Promise>
,然后使用ifPresentOrElse
来对 Promise 或空的 Optional 做一些事情,例如你在你的情况下似乎正在做的日志记录.
但是您还有一个更高级别的flatMap
,我不清楚它是哪种类型。 这个平面图是Promise
吗? 然后,您还必须从可选的另一个分支返回 Promise,并且您可以使用optionalProperty.map(...).orElse( <create empty Promise here> )
。
如果您想懒惰地创建空分支(通过Supplier
),还可以检查orElseGet()
而不是orElse()
) 。
ifPresentOrElse
返回void
。 您可能想要的是map
和orElseGet
的组合:
optionalProperty.map(/* code to return a Promise */)
.orElseGet(() -> /* code to return a Promise that is immediately resolved */);
在orElseGet()
的供应商内部,您可以放置logger.error
语句。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.