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
当可选项为空时,如果您想执行某些操作(例如日志记录),您会想要使用。
添加回答
举报