3 回答

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

TA貢獻1818條經驗 獲得超11個贊
ifPresentOrElse
可能不是您要使用的方法,而是.orElse
.
return optionalLocation.orElse(String.valueOf(response.getStatus()));
ifPresentOrElse
當可選項為空時,如果您想執行某些操作(例如日志記錄),您會想要使用。
添加回答
舉報