如果样Java中避免写嵌套式的代码详解

  

  

可选的代码相对更加简洁,当代码量较大时,我们很容易忘记进行空判定,但是使用可选类则会避免这类问题。

  

下面这是一个嵌套的如果判断,业务逻辑是从httpRequst中获取X-Auth-Token的值。逻辑是如果头中有值则从标题中取值否则从cookie中取值,取到值后调用一个http远程接口获取用户信息,获取不到则报”获取用户信息失败”,如果令牌都不存在则直接返回httpRespons为401 - noauth

  

这下面是之前同事写的代码

  

        如果(methodNeedAuth) {//* * *身份验证   字符串标记=request.getHeader (“X-Auth-Token”);   如果(StringUtils.isEmpty(令牌)){//如果头中没有X-Auth-Token则从cookie中取   饼干饼干[]=request.getCookies ();   如果(饼干==null | |饼干。长度==0){//cookie都为null   返回returnNoAuthResult(响应);   }//这个地方判空,否则下面的数组。流回报空指针异常   令牌=Arrays.stream(饼干)。过滤器(cookie→   “X-Auth-Token”.equals (cookie.getName ())   ).collect (Collectors.toList ()) . get (0) .getValue ();   如果令牌==null){//饼干有值但是饼干中没有X-Auth-Token   返回returnNoAuthResult(响应);   }   }   如果(! StringTool.isNullOrEmpty(令牌)){   用户信息=userService.getUserInfoByToken(令牌);   }   如果(用户信息==null | | StringTool.isNullOrEmpty (userInfo.getUser_id ())) {   返回returnNoAuthResult(响应);   }   }      

        如果(methodNeedAuth) {//* * *身份验证   字符串标记=Optional.ofNullable (request.getHeader (“X-Auth-Token”)) .orElseGet (()→   getTokenFromCookie(请求)//提取出一个方法   );   用户信息=Optional.ofNullable(令牌). map(试一试。(t→   userService.getUserInfoByToken (t))   ).orElse(空);   如果(用户信息==null | | StringTool.isNullOrEmpty (userInfo.getUser_id ())) {   响应。sendError(401年,“无身份验证”);   返回错误;   }   }/* *   *从cookie中获取令牌   */私人字符串getTokenFromCookie (HttpServletRequest请求){   饼干[]饼干=Optional.ofNullable (request.getCookies ())。orElse(新饼干[0]);//可选强制赋默认值,饼干一定不为null   字符串饼干=Arrays.stream(饼干)。过滤器(项→   “X-Auth-Token”.equals (item.getName ())   ).findFirst () . map (Cookie:: getValue) .orElse(空);   返回饼干;   }      


  

  

<强> Java8可选的常规用法
  

  

Java8的可选可以规避所有的空指针异常问题么?答案当然是否定的,<代码> Optional() 也是对象,他也会为null,所以也有可能报空指针异常哟。

  

<强>可选的三种构造方式:Optional.of (obj) Optional.ofNullable (obj)和明确的Optional.empty()
  

  
      <李> <代码> Optional.of (obj)>   <李> <代码> Optional.ofNullable (obj)> Optional.empty()> Optional.of (obj)
      李   
  

那是不是我们只要用<代码> Optional.ofNullable (obj) 一劳永逸,以不变应二变的方式来构造可选实例就行了呢& # 63;那也未必,否则<代码> Optional.of (obj) 何必如此暴露呢,私有则可& # 63;
  

  

我本人的观点是:

  
      <李>当我们非常非常的明确将要传给<代码> Optional.of (obj) 的obj参数不可能为null时,比如它是一个刚新出来的对象<代码>(可选。(新用户(…)))>   <李>当想为obj断言不为null时,即我们想在万一obj为空立即报告NullPointException异常,立即修改,而不是隐藏空指针异常时,我们就应该果断的用<代码> Optional.of (obj) 来构造可选实例,而不让任何不可预计的零值有可乘之机隐身于可选中。   
  

<强> Java8可选的需要小心的地方
  

  
      <李>报告呼吁java.util.Optional.get()没有首先检查isPresent()调用一个值是可用的。如果可选不包含一个值,得到()方法将抛出一个异常。(调用<代码> Optional.get() 前不事先用<代码> isPresent() 检查值是否可用。假如可选不包含一个值,得到()将会抛出一个异常)   

    如果样Java中避免写嵌套式的代码详解