可选的代码相对更加简洁,当代码量较大时,我们很容易忘记进行空判定,但是使用可选类则会避免这类问题。
下面这是一个嵌套的如果判断,业务逻辑是从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
<强>可选的三种构造方式:Optional.of (obj) Optional.ofNullable (obj)和明确的Optional.empty() 强>
-
<李> <代码> Optional.of (obj)> 代码:它要求传入的obj不能是null值的,否则还没开始进入角色就倒在了NullPointerException异常上了。李>
<李> <代码> 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() 代码>检查值是否可用。假如可选不包含一个值,得到()将会抛出一个异常)李>