亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

創建一個類變量只是為了在 Optional.ifPresentOrElse 中使用是一種應該避免

創建一個類變量只是為了在 Optional.ifPresentOrElse 中使用是一種應該避免

弒天下 2023-05-10 17:08:17
簡而言之,我的上下文是:調用一個 API,如果我找到某個標頭變量,我將其子字符串化以返回一個值。如果不是,我必須返回 Response.status。我已經用這段代碼成功地達到了這樣的要求:...import com.mashape.unirest.*...@Controllerpublic class MainController {    private final String gmailKey = "XXX";    private String stringRetorno = "0";    @ResponseBody    @GetMapping("/getsessionkey")    public String getSessionKey() {        try {            HttpResponse<String> 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();            Optional<String> optionalLocation = Optional.ofNullable(response.getHeaders().getFirst("Location"));            optionalLocation.ifPresentOrElse(l -> stringRetorno = l.substring(l.lastIndexOf("/") + 1),                    () -> stringRetorno = String.valueOf(response.getStatus()));        } catch (Exception e) {            e.printStackTrace();        }        return stringRetorno;    }我的懷疑取決于我編碼的正確程度。我沒有編寫 if&null 鏈,而是決定使用 Optional 的更優雅和更易讀的方式。但是如果我在方法內部創建 stringRetorno,我會面臨“在封閉范圍內定義的局部變量 stringRetorno 必須是最終的或有效的最終”。四處搜索我發現作為解決方案創建 stringRetorno 作為類變量。所以我的直截了當的問題是:我是不是在做一些要避免的事情?一些可能無法回答我的問題但非常有用的問題是:我是否應該更喜歡其他 Java HTTP 客戶端而不是 com.mashape.unirest ,它可能已經提供了 Optional 這樣我就可以編寫不那么冗長的代碼?我根本不想比較圖書館。我的重點是與接收缺少特定鍵(位置)的響應標頭的可能性相結合。而且,如果 API 提供者建議的輕量級 unirest 迫使我采取變通辦法,那么另一個提供 Optional 作為答案的庫的建議應該對我有所幫助。在 Try/Catch 塊中寫 Optional 不是很費勁嗎?
查看完整描述

3 回答

?
MMMHUHU

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()));


}


查看完整回答
反對 回復 2023-05-10
?
四季花海

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 不是很費勁嗎?

不?也許“壓倒性”不是您要查找的術語,但即使您的意思真的是“矯枉過正”或“過度”或類似的意思,也仍然不是。我什至不明白為什么你認為它可能是這樣。


查看完整回答
反對 回復 2023-05-10
?
慕尼黑8549860

TA貢獻1818條經驗 獲得超11個贊

ifPresentOrElse可能不是您要使用的方法,而是.orElse.

return optionalLocation.orElse(String.valueOf(response.getStatus()));

ifPresentOrElse當可選項為空時,如果您想執行某些操作(例如日志記錄),您會想要使用。


查看完整回答
反對 回復 2023-05-10
  • 3 回答
  • 0 關注
  • 230 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號