我正試圖解決我面臨的當前問題。
我有一個回傳 Optional 型別的函式(具有一些屬性的物件)
其中一個屬性是可能存在或不存在的 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
有沒有一種功能更好的方法來實作這一目標?
uj5u.com熱心網友回復:
是的,有辦法,但你也必須決定如果它Optional是空的怎么辦。當前,如果存在可選項,則要回傳 a Promise,如果為空,則不回傳任何內容(“void”)。這不起作用,兩個分支的型別必須相同。
您可以使用optionalProperty.map()將您的原件映射Optional到 a Optional<Promise>,然后使用ifPresentOrElse, 對 Promise 或空的 Optional 執行某些操作,例如按照您在案例中所做的記錄。
但是你也有一個更高的級別flatMap,我不清楚它是哪種型別。這個平面圖有Promise嗎?然后你必須從可選的另一個分支回傳一個 Promise,你可以使用optionalProperty.map(...).orElse( <create empty Promise here> ).
如果您想懶惰地創建空分支(通過) ,也請檢查orElseGet()而不是。orElse()Supplier
uj5u.com熱心網友回復:
ifPresentOrElse回傳void。您可能想要的是mapand的組合orElseGet:
optionalProperty.map(/* code to return a Promise */)
.orElseGet(() -> /* code to return a Promise that is immediately resolved */);
里面的供應商給orElseGet()你可以放你的logger.error宣告。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/444341.html
上一篇:在mac上找不到jvm路徑
下一篇:硒|影根|鍵盤無法訪問元素輸入
