3 回答

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個(gè)贊
@ResponseBody
@GetMapping("/getsessionkey")
public String getSessionKey() {
Optional<String> optionalLocation = null;
HttpResponse<String> response = null;
try {
response = Unirest
.post("https://skyscanner-skyscanner-flight-search-v1.p.rapidapi.com/apiservices/pricing/v1.0")
.header("x-rapidapi-host", "skyscanner-skyscanner-flight-search-v1.p.rapidapi.com")
.header("x-rapidapi-key", gmailKey).header("Content-Type", "application/x-www-form-urlencoded")
.body("inboundDate=2019-11-25&cabinClass=economy&children=0&infants=0&Country=BR&Currency=BRL&locale=pt-BR&originPlace=GRU-sky&destinationPlace=MCZ-sky&outboundDate=2019-11-19&adults=2")
.asString();
optionalLocation = Optional.ofNullable(response.getHeaders().getFirst("Location"));
} catch (Exception e) {
e.printStackTrace();
}
return optionalLocation.map(l -> l.substring(l.lastIndexOf("/") + 1))
.orElse(String.valueOf(response.getStatus()));
}

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
我正在做一些要避免的事情嗎?
是的。將變量拉出與其相關(guān)的唯一方法之外是一種糟糕的形式。此外,實(shí)際上,它會(huì)為您帶來線程安全問題——正如目前所寫的那樣,使用您的類并允許調(diào)用兩個(gè)不同線程的程序可能因此無法正確同步MainController.getSessionKey()
。如果它是方法的局部變量,情況就不一樣了。
如果它是字符串的可變?nèi)萜?/em>(例如數(shù)組、List
或) ,則可以使用該方法的本地變量。AtomicReference
然后容器可以是最終的或?qū)嶋H上是最終的,而不會(huì)阻止您更改其內(nèi)容。
但是使用map()
和的組合會(huì)更干凈orElse()
,這樣您就不需要首先使用 lambda 設(shè)置字符串引用:
stringRetorno = optionalLocation.map(l -> l.substring(l.lastIndexOf("/") + 1)) .orElse(String.valueOf(response.getStatus()));
我是否應(yīng)該更喜歡其他 Java HTTP 客戶端而不是 com.mashape.unirest ,它可能已經(jīng)提供了 Optional 這樣我就可以編寫不那么冗長的代碼?
也許我誤解了,但我從中看到的唯一代碼節(jié)省是刪除調(diào)用Optional.ofNullable()
(但保留其參數(shù)的等價(jià)物)。這并沒有減少多少冗長,也沒有多少(如果有的話)清晰度的提高。我不會(huì)認(rèn)為這樣做的可能性是尋找不同客戶的任何理由。
(但如果您確實(shí)在尋找不同的客戶,請不要看這里。對圖書館和其他場外資源的推薦在這里是題外話。)
在 Try/Catch 塊中寫 Optional 不是很費(fèi)勁嗎?
不?也許“壓倒性”不是您要查找的術(shù)語,但即使您的意思真的是“矯枉過正”或“過度”或類似的意思,也仍然不是。我什至不明白為什么你認(rèn)為它可能是這樣。

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊
ifPresentOrElse
可能不是您要使用的方法,而是.orElse
.
return optionalLocation.orElse(String.valueOf(response.getStatus()));
ifPresentOrElse
當(dāng)可選項(xiàng)為空時(shí),如果您想執(zhí)行某些操作(例如日志記錄),您會(huì)想要使用。
添加回答
舉報(bào)