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的正确使用姿势,真的不来稍微了解一下吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java8 Optional 的正确姿势

[转] 使用 Java8 Optional 的正确姿势

Java8 新特性 Optional 类

Java8新特性--Optional

Java8新特性:Optional类(超详解)

Java8新特性不了解Optional类,简历上别说你懂Java8!!