Optional类(java.util.Optional)是一个容器类,表示一个值的存在或不存在。过去,null用于表示没有值。现在Optional可以更好的表达这个概念。并且可以避免空指针异常。Optional对象构造&取值方法实例代码如下ofNullable("java8");System.out.println(optional.get());System.out.println(optional.orElse("java"));System.out.println(optional.orElseGet(()->"java"));System.out.println(optional.orElseThrow(()->newRuntimeException()));//该值可以为空,建议使用optional=Optional.ofNullable(null);//NoSuchElementException在运行时抛出Java"));系统。out.println(optional.orElseThrow(()->newRuntimeException()));Optional逻辑判断操作这里可以使用Optional提供的API相关方法进行逻辑判断操作。用户记录查询——消除空判断以用户模块为例,在UserService中提供queryUserById方法供客户端调用,如下:publicUserqueryUserById(IntegeruserId){returnnull;}客户端调用之前的逻辑代码以java8为例避免null。如下形式:Useruser=userService.queryUserById(10);if(null!=user){System.out.println("匹配用户");/***执行其他操作*/}else{System.out.println("Userdoesnotexist");}使用Optional形式如下:OptionaluserOptional=Optional.ofNullable(user);//使用isPresent方法判断if(userOptional.isPresent()){System.out.println("匹配用户");/***执行其他操作*/}else{System.out.println("Userdoesnotexist");}当然,由于使用了Optional,所以ifelse的代码一般都是一样的可以省略如下(程序逻辑只关注非空情况,使用ifPresent进行if判断)://使用ifPresent执行if判断操作userOptional.ifPresent((u)->{System.out.println("匹配到theUser");/***执行其他操作*/});使用maporElse方法还可以执行ifelse的逻辑判断如下:userOptional.map((u)->{System.out.println("MatchedtoTheuser!");/***执行其他操作*/返回u;}).orElse(null);返回业务逻辑结果通常,在网站处理用户登录逻辑时,如果登录结果通常是由后端接口返回,在Java8之前后端代码的实现可能是这样返回的借助ResultInfo的用户登录结果。结果信息resultInfo=null;user=userService.queryUserByUnameAndUpwd(uname,upwd);//判断用户对象是否为空if(user==null){//用户不存在resultInfo=newResultInfo(300,"登录失败,用户名或密码错误",null);}else{resultInfo=newResultInfo(200,"登录成功",user);}这时候使用OptionalmaporElse也可以替换如下(省略ifelse的逻辑代码)userOptional=Optional.ofNullable(userService.queryUserByUnameAndUpwd(uname,upwd));//执行maporElse判断userOptional.map((u)->{/***如果用户记录存在*/returnnewResultInfo(200,"Login成功",u);}).orElse(newResultInfo(300,"登录失败,用户名或密码错误",null));Optional值过滤filter方法在Optional对象不为空的基础上增加了断言判断操作,该方法返回值仍然为Optional。这种操作为参数判断提供了极大的便利,比如参数满足指定条件时的后续操作sql查询操作字符串拼接,普通servlet处理多请求页面转发处理等操作。页面转发过滤在使用Servlet编写web后台代码控制页面转发时,通常使用一个Servlet来转发异步请求和相应的页面,并使用Optional来实现参数合法性过滤的操作。相关信息如下:Stringaction="main";Optionaloptional=Optional.ofNullable(action);Stringpage=optional.filter(a->a.trim().equals("")||a.equals("main")).map((str)->{System.out.println("转发到主页面");return"main";}).orElseGet(()->{System.out.println("抓到首页");return"index";});多条件动态sql参数过滤对于web应用中的多条件查询操作,通常后端在处理时更多的是对sql进行动态拼接以达到最终目的(搜索引擎除外)。该场景也可以使用optional过滤参数值,相关代码如下:Stringtitle="";Stringtype="";StringBuildersqlBuilder=newStringBuilder("select*fromblogwhereuser_id=2019");选修的。ofNullable(title).filter(StringUtils::isNoneBlank).ifPresent(t->{sqlBuilder.append("andtitle"+"%"+title+"%");});Optional.ofNullable(type).filter(t->!t.trim().equals("")&&!t.equals("1")).ifPresent(t->{sqlBuilder.append("andtype="+type);});Optio中的可选应用程序Java8nal的引入使得开发能够避免大量Null指针的出现。借助相关方法,避免了ifelse繁琐的逻辑代码编写。对于它的应用,常用于空旷的场景。对于ifelse的逻辑场景,也使用Optional让程序更加简洁,使用Optional实现代码的链式处理nd("andtype="+type);});##Optional的应用Java8中Optional的引入使得开发避免了很多Null指针的出现,借助相关方法,避免了ifelse繁琐的逻辑代码编写。对于它的应用,常用于空旷的场景。对于ifelse的逻辑场景,也使用了optional,让程序更加简洁。同时,Optional的使用可以实现代码的链式处理。/png