五.Optional类
Optional类可以优雅的处理空指针异常。它可以保存T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在。原来用null表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。
Optional提供了很多方法,这样我们就不用显式进行空值检测。
【创建实例对象】
创建Optional类对象方法 |
描述 |
| of(T t) | 创建一个Optional实例 t 必须非空 |
| empty() | 创建一个空的 Optional 实例 |
| ofNullable(T t) | t 可以为 null |
通过 of() 方法创建对象,school 不能为空,为空则抛出控制值异常
public class LambdaTest { @Test public void test() { School school=new School(); Optional<School> optionalSchool = Optional.of(school); } }
public class LambdaTest { @Test public void test() { School school=new School(); school=null; Optional<School> optionalSchool = Optional.of(school); } }
通过 ofNullable(school) 创建对象,school 可以为空
public class LambdaTest { @Test public void test() { School school=new School(); school=null; Optional<School> optionalSchool = Optional.ofNullable(school); System.out.println(optionalSchool); } }
【对容器中对象进行操作】
判断Optional容器中是否包含对象方法 |
描述 |
| boolean isPresent() | 判断是否包含对象 |
| boolean ifPresent(Consumer<? super T> consumer) | 如果有值,就执行Consumer接口的实现代码,并且该值会作为参数传给它 |
Optional对象的 isPresent() 方法使用
public class LambdaTest { @Test public void test() { School school=new School(); school=null; Optional<School> optionalSchool = Optional.ofNullable(school); System.out.println(optionalSchool.isPresent()); } }
【获取容器的对象】
获取Optional容器的对象方法 |
描述 |
| T get() | 如果调用对象包含值,返回该值,否则抛异常 |
| T orElse(T other) | 如果有值则将其返回,否则返回指定的other对象 |
| T orElseGet(Supplier<? extends T> other) | 如果有值将其返回,否则返回由Supplier接口实现提供的对象 |
| T orElseThrow(Supplier<? extends X> exceptionSupplier) | 如果有值将其返回,否则返回由Supplier接口实现提供的异常 |
orElse 方法
public class OptionalTest { //内部类 public class Student{ public Student() { } public Student(Integer id, String name) { this.id = id; this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } private Integer id; private String name; } @Test public void test(){ String name = getStudentName(new Student(1, "小五")); System.out.println(name); } private String getStudentName(Student student){ //ofNullable()可以接收student为null Optional<Student> optional = Optional.ofNullable(student); //如果当前的optional内部封装的student不为空,则返回内部的studetn如果为空,则返回.orElse(new Student(1, "张三"))方法中的参数 return optional.orElse(new Student(1, "张三")).getName(); } }
public class OptionalTest { //内部类 public class Student{ public Student() { } public Student(Integer id, String name) { this.id = id; this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } private Integer id; private String name; } @Test public void test(){ String name = getStudentName(null); System.out.println(name); } private String getStudentName(Student student){ //ofNullable()可以接收student为null Optional<Student> optional = Optional.ofNullable(student); //如果当前的optional内部封装的student不为空,则返回内部的studetn如果为空,则返回.orElse(new Student(1, "张三"))方法中的参数 return optional.orElse(new Student(1, "张三")).getName(); } }
如果明确知道数据就是非空可以搭配使用:of() + get() 。
如果要避免空指针的话可以搭配使用:
ofNullable()+orElse()。
总体来说Java8大部分都是语法相关,部分方法没有演示,看完之后一定要多练习,熟能生巧。





