您好,登錄后才能下訂單哦!
前言
Optional的代碼相對更加簡潔,當代碼量較大時,我們很容易忘記進行null判定,但是使用Optional類則會避免這類問題。
下面這是一個嵌套的 if 判斷,業務邏輯是從 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 規避 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 的常規用法
Java8 的 Optional 可以規避所有的空指針異常問題么?答案當然是否定的, 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 常量時;Optional.of(obj)
來構造 Optional 實例, 而不讓任何不可預計的 null 值有可乘之機隱身于 Optional 中.Java8 Optional需要小心的地方
Optional.get()
前不事先用 isPresent()
檢查值是否可用. 假如 Optional 不包含一個值, get() 將會拋出一個異常)一句話小結: 使用 Optional 時盡量不直接調用 Optional.get()
方法, Optional.isPresent()
更應該被視為一個私有方法, 應依賴于其他像 Optional.orElse()
, Optional.orElseGet()
, Optional.map()
等這樣的方法.
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。