最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中避免寫嵌套if樣式的代碼詳解

 更新時間:2017年07月04日 15:35:48   作者:陳尚  
這篇文章主要給大家介紹了在Java中如何避免寫嵌套if樣式的相關資料,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。

前言

Optional的代碼相對更加簡潔,當代碼量較大時,我們很容易忘記進行null判定,但是使用Optional類則會避免這類問題。

下面這是一個嵌套的 if 判斷,業(yè)務邏輯是從 httpRequst 中獲取 X-Auth-Token 的值。邏輯是如果 header中有值則從 header 中取值否則從 cookie 中取值,取到值后調用一個 http 遠程接口 獲取用戶信息,獲取不到則報“獲取用戶信息失敗”,如果 token 都不存在則直接返回 httpRespons 為 401-NoAuth

這下面是之前同事寫的代碼

if 嵌套代碼

if (methodNeedAuth) {
 //***身份驗證
 String token = request.getHeader("X-Auth-Token");
 if (StringUtils.isEmpty(token)) { // 如果 header 中沒有 X-Auth-Token 則從 cookie 中取
 Cookie[] cookies = request.getCookies();
 if (cookies == null || cookies.length == 0) { //cookie 都為 null
  return returnNoAuthResult(response);
 } //這個地方判空,否則下面的 Arrays.stream 回報空指針異常
 token = Arrays.stream(cookies).filter(cookie ->
  "X-Auth-Token".equals(cookie.getName())
 ).collect(Collectors.toList()).get(0).getValue();
 if (token == null) { // cookie 有值但是 cookie 中沒有 X-Auth-Token
  return returnNoAuthResult(response);
 }
 }
 if (!StringTool.isNullOrEmpty(token)) {
 userInfo = userService.getUserInfoByToken(token);
 }
 if (userInfo == null || StringTool.isNullOrEmpty(userInfo.getUser_id())) {
 return returnNoAuthResult(response);
 }
}

Optional 規(guī)避 if 嵌套

if (methodNeedAuth) {
 //***身份驗證
 String token = Optional.ofNullable(request.getHeader("X-Auth-Token")).orElseGet(() ->
  getTokenFromCookie(request) //提取出一個方法
 );
 userInfo = Optional.ofNullable(token).map(Try.of(t ->
  userService.getUserInfoByToken(t))
 ).orElse(null);
 if (userInfo == null || StringTool.isNullOrEmpty(userInfo.getUser_id())) {
 response.sendError(401, "no auth");
 return false;
 }
}
/**
 * 從 cookie 中獲取 token
 */
private String getTokenFromCookie(HttpServletRequest request) {
 Cookie[] cookies = Optional.ofNullable(request.getCookies()).orElse(new Cookie[0]); // Optional 強制賦默認值,cookies一定不為 null
 String cookie = Arrays.stream(cookies).filter(item ->
  "X-Auth-Token".equals(item.getName())
 ).findFirst().map(Cookie::getValue).orElse(null);
 return cookie;
}

小結

Java8 Optional 的常規(guī)用法

Java8 的 Optional 可以規(guī)避所有的空指針異常問題么?答案當然是否定的, Optional<T>() 也是對象,他也會為 null, 所以也有可能報空指針異常喲。

Optional 的三種構造方式: Optional.of(obj), Optional.ofNullable(obj) 和明確的 Optional.empty()

  • Optional.of(obj) : 它要求傳入的 obj 不能是 null 值的, 否則還沒開始進入角色就倒在了 NullPointerException 異常上了.
  • Optional.ofNullable(obj) : 它以一種智能的, 寬容的方式來構造一個 Optional 實例. 來者不拒, 傳 null 進到就得到 Optional.empty() , 非 null 就調用 Optional.of(obj) .

那是不是我們只要用 Optional.ofNullable(obj) 一勞永逸, 以不變應二變的方式來構造 Optional 實例就行了呢? 那也未必, 否則 Optional.of(obj) 何必如此暴露呢, 私有則可?

我本人的觀點是:

  • 當我們非常非常的明確將要傳給 Optional.of(obj) 的 obj 參數不可能為 null 時, 比如它是一個剛 new 出來的對象(Optional.of(new User(…))) , 或者是一個非 null 常量時;
  • 當想為 obj 斷言不為 null 時, 即我們想在萬一 obj 為 null 立即報告 NullPointException 異常, 立即修改, 而不是隱藏空指針異常時, 我們就應該果斷的用 Optional.of(obj) 來構造 Optional 實例, 而不讓任何不可預計的 null 值有可乘之機隱身于 Optional 中.

Java8 Optional需要小心的地方

  • Reports calls to java.util.Optional.get() without first checking with a isPresent() call if a value is available. If the Optional does not contain a value, get() will throw an exception. (調用 Optional.get() 前不事先用 isPresent() 檢查值是否可用. 假如 Optional 不包含一個值, get() 將會拋出一個異常)
  • Reports any uses of java.util.Optional, java.util.OptionalDouble, java.util.OptionalInt, java.util.OptionalLong or com.google.common.base.Optional as the type for a field or a parameter. Optional was designed to provide a limited mechanism for library method return types where there needed to be a clear way to represent “no result”. Using a field with type java.util.Optional is also problematic if the class needs to be Serializable, which java.util.Optional is not. (使用任何像 Optional 的類型作為字段或方法參數都是不可取的. Optional 只設計為類庫方法的, 可明確表示可能無值情況下的返回類型. Optional 類型不可被序列化, 用作字段類型會出問題的)

一句話小結: 使用 Optional 時盡量不直接調用 Optional.get() 方法, Optional.isPresent() 更應該被視為一個私有方法, 應依賴于其他像 Optional.orElse() , Optional.orElseGet() , Optional.map() 等這樣的方法.

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • Java多例設計模式實例詳解

    Java多例設計模式實例詳解

    這篇文章主要介紹了Java多例設計模式,結合實例形式分析了基于Java的多例模式概念、原理、定義與使用方法,需要的朋友可以參考下
    2018-05-05
  • springmvc整合freemarker配置的詳細步驟

    springmvc整合freemarker配置的詳細步驟

    本篇文章主要介紹了springmvc整合freemarker的詳細步驟,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 升級dubbo2.7.4.1版本平滑遷移到注冊中心nacos

    升級dubbo2.7.4.1版本平滑遷移到注冊中心nacos

    這篇文章主要為大家介紹了2.7.4.1的dubbo平滑遷移到注冊中心nacos的兩種版本升級方案,以及為什要升級,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • mybatis中的setting配置詳解

    mybatis中的setting配置詳解

    這篇文章主要給大家介紹了關于mybatis中setting配置的相關資料,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-06-06
  • 詳解Java8中的Lambda表達式

    詳解Java8中的Lambda表達式

    這篇文章主要介紹了Java8中的Lambda表達式的相關資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • 解決Nacos成功啟動但是無法訪問 (Connection refused)

    解決Nacos成功啟動但是無法訪問 (Connection refused)

    這篇文章主要介紹了解決Nacos成功啟動但是無法訪問 (Connection refused)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Springboot打包部署修改配置文件的方法

    Springboot打包部署修改配置文件的方法

    這篇文章主要介紹了Springboot打包部署修改配置文件的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • 如何將Java與C#時間進行互相轉換

    如何將Java與C#時間進行互相轉換

    這篇文章主要介紹了Java與C#時間互轉的方法以及JAVA日期、C#日期計算說明,需要的朋友可以參考下
    2022-11-11
  • Spring配置文件如何使用${username}

    Spring配置文件如何使用${username}

    這篇文章主要介紹了Spring配置文件如何使用${username},文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • SpringBoot整合Security實現權限控制框架(案例詳解)

    SpringBoot整合Security實現權限控制框架(案例詳解)

    Spring Security是一個能夠為基于Spring的企業(yè)應用系統提供聲明式的安全訪問控制解決方案的安全框,是一個重量級的安全管理框架,本文給大家介紹的非常詳細,需要的朋友參考下吧
    2021-08-08

最新評論

石景山区| 瓮安县| 富顺县| 东莞市| 武功县| 怀仁县| 罗甸县| 泸水县| 河北省| 昭觉县| 西安市| 中江县| 平泉县| 合阳县| 广西| 新营市| 桑日县| 汶上县| 贵定县| 桦川县| 恩施市| 库尔勒市| 湘阴县| 开阳县| 泊头市| 牙克石市| 阿拉善右旗| 滨海县| 涟水县| 石林| 乌兰浩特市| 绥宁县| 登封市| 鄄城县| 辽宁省| 宁蒗| 宾阳县| 广元市| 古田县| 甘南县| 兴海县|