Java8新特性 Optional的正确使用姿势,真的不来稍微了解一下吗?
Posted 守夜人爱吃兔子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8新特性 Optional的正确使用姿势,真的不来稍微了解一下吗?相关的知识,希望对你有一定的参考价值。
简介
Java8的新特性提供了一个可以容纳null的容器类,可以很好的解决空指针异常等情况,用处极大。Optional类是一个容器类,它可以保存模板类型T的值,也可以保存null。
——如果值存在,调用isPresent()返回ture,这时调用get()即可返回容器中保存的对象,通过这种方式我们就不需要单独进行空指针异常,还方便了函数式编程。
有什么用?
思考一下:为什么说解决了空指针异常的问题?
在Java8以前,在调用对象时都需要验证其是否为null,像这种方式很有可能导致空指针异常:
String name = student.getInfo().getName();
为了避免抛出异常,需要进行验证:
{
....
if(student!=null){
Info info = student.getInfo();
if(info!=null){
String name = info.getName();
return name;
}
}
...
}
太麻烦了!!
而JDK8所引入的Optional类可以让一切变得简单。
不信?Show you the code:
{
......
Student student =Student().builder()......build();
Optional<Student> studentOp=Optional.ofNullable(student);
Info info = new Info();
studentOp.ifPresent(stu->{info =stu.getInfo();};
...
}
如上所示,optional提供了一种简洁的避免空指针异常,以及优雅地获取容器类值的方式,并且还支持lambda函数式编程。
其他方法
来看看Optional还有其他哪些值得一提的API。
of及ofNull
用Optional实例.of()的操作只能接受非空参数,否则会报空指针异常;
而用.ofNullable()则没有这样的限制,空与非空都可接受,根据实际场景来选择:
Student student=null;
//会报错
Optional<Student> stuOp=Optional.of(student);
//不会报错
Optional<Student> stuOp=Optional.ofNullable(student);
由于ofNullable在空值的时候也可以正常接收,因此在使用的时候要注意到底允不允许这样的null值存在,并且在使用前可以使用下面的API进行验证。
isPresent、ifPresent
isPresent()可以用来验证Optional实例中的值是否有值,若为null则返回false,其实isPresent就等同于一个对Optional容器中对象的if语句。
ifPresent()是一种函数式编程接口:如果Optional中为非null,则调用consumer函数。consumer是指继承自Consumer类的抽象方法,可以对传入的数据进行处理,另外可以直接使用lambda表达式。
形如上式的:
studentOp.ifPresent((stu)->{info =stu.getInfo()});
如果studentOp中的Student对象不为null,则将该对象作为stu进行相应的运算,大大简化了程序。
get
该方法用来返回Optional中的值,如果为null,则会抛出异常:NoSuchElementException、
orElse与orElseGet
orElse用来返回Optional实例中的值,如果为null,则返回给定的值。如:
studentOp.orElse(println("hello!"));
orElseGet则有一些不同,orElseGet支持使用lambda表达式,实现自定义输出。
map
map方法可以实现对Optional实例进行连续操作,如果optional中有值,就调用mapping函数得到返回值。且若返回值不为null,则返回的是包含mapping函数返回值值的Optional。否则返回空Optional。
map函数可以使用lambda表达式。map函数可以说是用处极大,并且结合orElse或者ifPresent可以实现酷炫的函数式编程。简单给个例子如下:
.......studentOp....
prtintln(studentOp.map((info)->info.setName("I'm xiaoming")).orElse("I'm King!"));
最后
给大家分享一篇一线开发大牛整理的java高并发核心编程神仙文档,里面主要包含的知识点有:多线程、线程池、内置锁、JMM、CAS、JUC、高并发设计模式、Java异步回调、CompletableFuture类等。
领取文档地址:GitHub标星12.5K+Java高并发核心编程知识笔记助我提升,感觉之前学的都是渣渣
感谢阅读,文章对你有帮助的话,不妨 一键三连 支持一下吧。你们的支持是我最大的动力,祝大家万事胜意!
以上是关于Java8新特性 Optional的正确使用姿势,真的不来稍微了解一下吗?的主要内容,如果未能解决你的问题,请参考以下文章