小伙伴们,上次小乐给大家详细介绍了Java8核心特性的Stream(流),点击可以回顾哦。

乐字节:乐字节Java8核心特性实战-Stream流​zhuanlan.zhihu.com

Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在或不存在,原来用null表示一个值不存在,现在Optional可以更好的表达这个概念。并且可以避免空指针异常。

1、Optinal对象构建&值获取方法

实例代码如下

Optional<String> optional = Optional.of("java8");
​
// NullPointerException空指针异常  值不能为空
optional = Optional.of(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(()->new RuntimeException()));
​
// 值可空  推荐使用
optional = Optional.ofNullable(null);
// 运行时抛出NoSuchElementException异常
System.out.println(optional.get());
System.out.println(optional.orElse("java"));
System.out.println(optional.orElseGet(()-> "java"));
System.out.println(optional.orElseThrow(()->new RuntimeException()));

2、Optional 逻辑判断操作

这里可以使用Optional提供的API相关方法来执行逻辑判断操作 .

3、用户记录查询-消除null判断

以用户模块为例,UserService中提供queryUserById方法供客户端调用,如下:

public User queryUserById(Integer userId){​return null;
}

客户端调用Java8以前逻辑代码为例避免null通常为如下形式

User user= userService.queryUserById(10);
if(null != user){System.out.println("匹配到该用户");/*** 执行其他操作*/
}else{System.out.println("用户不存在");
}

使用Optional 形式如下:

Optional<User> userOptional =   Optional.ofNullable(user);
// 使用isPresent 方法进行判断
if(userOptional.isPresent()){System.out.println("匹配到该用户");/*** 执行其他操作*/
}else{System.out.println("用户不存在");
}

当然,既然使用了Optional了,对于if else 的代码通常也是可以给省略掉 如下(程序逻辑只关注非空的情况,使用ifPresent 进行if判断):

  // 使用ifPresent 执行if 判断操作userOptional.ifPresent((u)->{System.out.println("匹配到该用户");/*** 执行其他操作*/});

使用map orElse方法同样也可以执行if else的逻辑判断 如下:

userOptional.map((u) -> {System.out.println("匹配到该用户!");/*** 执行其他操作*/return u;
}).orElse(null);

4、业务逻辑结果返回

通常,在在web网站时,对于用户登录逻辑进行处理时,如果登录的结果通常由后端接口来返回,而对于后端代码的实现在Java8以前可能是这样的 借助ResultInfo 返回用户登录结果

ResultInfo resultInfo=null;
user  = userService.queryUserByUnameAndUpwd(uname,upwd);
// 判断user对象是否为空
if (user == null) { // 用户不存在resultInfo=new ResultInfo(300,"登录失败,用户名或密码错误",null);
}else{resultInfo=new ResultInfo(200,"登录成功",user);
}

此时,使用Optional map orElse同样可以进行替换如下(省去if else 的逻辑代码)

userOptional= Optional.ofNullable(userService.queryUserByUnameAndUpwd(uname,upwd));
// 执行 map orElse 判断
userOptional.map((u)->{/*** 如果用户记录存在*/return new ResultInfo(200,"登录成功",u);
}).orElse(new ResultInfo(300,"登录失败,用户名或密码错误",null));

5、Optional 值过滤

filter方法在Optinal对象非空的基础之上加入断言判断操作,方法返回值仍然为Optinal。这种操作对于参数判断提供很大便利,例如参数满足指定条件的后续操作sql查询操作字符串拼接,常见的servlet处理多请求页面转发处理等操作。

页面转发过滤

在使用Servlet 编写web 后端代码对页面进行转发控制时,通常会通过一个Servelt 来转发不同步请求以及相应页面,使用Optional 来达到参数合法性过滤的操作,相关如下:

String action = "main";
Optional<String> optional = Optional.ofNullable(action);
String page = 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同样能够用于该场景下参数值过滤操作,相关代码如下:

String title = "";
String type = "";
StringBuilder sqlBuilder = new StringBuilder("select * from blog where user_id=2019 ");
Optional.ofNullable(title).filter(StringUtils::isNoneBlank).ifPresent(t -> {sqlBuilder.append(" and title " + "%" + title + "%");});
Optional.ofNullable(type).filter(t -> !t.trim().equals("") && !t.equals("1")).ifPresent(t -> {sqlBuilder.append(" and  type = " + type);}); 

6、Optional应用

Java8中Optional的引入,使得开发避免了大量Null指针的出现,借助相关方法避免了if else这种繁琐的逻辑代码编写,对于其应用,在处理空的场景下应用较多,对于if else的逻辑场景,同样使用Optional让程序更加简洁,同时使用Optional可以实现代码的链式处理。

Java8的六个核心特性都讲完了,小乐还会继续创作Java新技术文章,请继续关注哦!

optional判断是否为空_乐字节Java8核心特性之Optional相关推荐

  1. java过滤4字节_乐字节Java8核心特性实战之四:方法引用

    Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法. 方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的 ...

  2. java8新特性_乐字节-Java8新特性-接口默认方法

    总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...

  3. java8新特性_乐字节-Java8新特性-函数式接口

    上一篇小乐带大家学过 Java8新特性-Lambda表达式,那什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口 ...

  4. idea重写接口没有@override_乐字节|Java8核心实战-接口默认方法

    JAVA8已经发布很久,是自java5(2004年发布)之后Oracle发布的最重要的一个版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性,对于国内外互联网公司来说,Java8是以后技术 ...

  5. java stream byte_乐字节-Java8新特性之Stream流(上)

    上一篇文章,小乐给大家介绍了<Java8新特性之方法引用>,下面接下来小乐将会给大家介绍Java8新特性之Stream,称之为流,本篇文章为上半部分. 1.什么是流? Java Se中对于 ...

  6. 【java8新特性】——Optional详解(三)

    一.简介 Optional类是Java8为了解决null值判断问题,借鉴google guava类库的Optional类而引入的一个同名Optional类,使用Optional类可以避免显式的null ...

  7. 【小家java】java8新特性之---Optional的使用,避免空指针,代替三目运算符

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  8. for循环如果先--_乐字节Java循环:循环控制和嵌套循环

    乐字节小乐上次讲完了Java反射,接下来小乐给大家讲述Java循环. 循环有以下四部分: Java循环 一.循环控制 1. do..while 直到型 ( 先执行后判断) ,结构为: 先执行循环体,后 ...

  9. java 获取 反射 方法 名_乐字节Java反射之一:反射概念与获取反射源头Class

    一.Java反射机制概念 "程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言",如Python, Ruby是动态语言:显然C++,Java,C#不是动态语言,但是JAV ...

最新文章

  1. 底部居中_4月9日小米9 SE布朗熊发布;小米新专利前置摄像挪屏幕底部
  2. kettle根据参数动态派生列
  3. 使用HTML5技术控制电脑或手机上的摄像头
  4. js json转xml(可自定义属性,区分大小写)
  5. C#连接Excel和Access(包括2003和2007版)方法总结
  6. vue 插入word模板 项目_10 分钟为你的 vue 项目编写代码文档
  7. Oracle 软件的安装
  8. ElasticSearch API文档查看
  9. 中国移动上市第二日逼近破发线
  10. C++常见错误:LINK:fatal error LNL1123:转换到COFF期间失败,文件无效或者损坏
  11. mimimiaaaaaa
  12. ORACLE 11.2.0.4 OCR VOTING DISK 模拟恢复场景
  13. oracle 判断为空赋一个值_求高手帮忙,oracle查出的值为null,怎么赋初始值?
  14. html语言设计表单实例,40多个漂亮的网页表单设计实例_HTML/Xhtml_网页制作
  15. php期末考试分数分布情况,考试成绩分析
  16. java.lang.IllegalStateException: Max number of active transactions reached:50
  17. 俞敏洪:度过有意义的生命(转)
  18. jira是干什么_JIRA是什么? | 学步园
  19. mysql统计类似SQL语句查询次数
  20. G2、D3 绘制维恩图

热门文章

  1. Android build.gradle 获取Git 仓库数据
  2. 动态创建html元素的几种方法
  3. Kong 1.0正式发布,提供服务网格支持和插件开发工具包
  4. Mysql8.0.12安装教程方法 Mysql8.0.12安装教程
  5. “无人化时代”正在逼近,网友:再不努力就无工可打啦!
  6. linux 构建 无线网络 过程
  7. 分享10个Android游戏源码,要的赶紧来哈
  8. 泛型集合中对继承类的转换
  9. C# Webbrowser 常用方法及多线程调用
  10. jquery数组(排序)