JDK8.0相关特性
七、Optional类
-
Optional 类:位于java.util.Optional包中,是一个容器类,代表一个值存在或是不存在(之前利用null表示一个值是否存在,JDK8.0开始利用Optional类更好的表达式一个值是否存在)。同时可以避免空指针异常
-
利用Optional类中的静态方法,获取Optional对象:
- of(T value):创建非空置,如果value为空,则抛出NullPointException异常
- empty():创建空值
- ofNullable(T value):创建Optional对象,允许null值
-
访问Optional对象
-
get():获取值,如果空值则抛出异常,异常信息为:
java.util.NoSuchElementException
-
isPresent():判断值是否存在
-
orElse(T value):获取值,如果无值则取默认值
-
orElseGet(Supplier s):带有逻辑,获取值
-
ifPresent(Consumer c):如果值存在,则消费值
-
map(Function f):将输入转换为另一种形式进行输出
//获取Optional的三种方式 Optional<Student> o=Optional.of(new Student());//创建非空值 System.out.println(o.get()); Optional<Student> o2=Optional.empty();//创建空值 System.out.println(o2.get()); Optional<Student> o3=Optional.ofNullable(null);//允许null值 System.out.println(o3.get()); //操作Optional对象 if(o3.isPresent()){ System.out.println(o3.get()); } Student s=o3.orElse( new Student("张三",28, Student.Status.Study)); System.out.println(s); //获取学生的姓名 Student s2=new Student(); Optional<Student> o4=Optional.of(s2); String name=o4.map((s5)->s5.getName()).orElse("no name"); System.out.println(name); o4.ifPresent(System.out::println);//不为空,则消费数据
-
-
注意事项:
-
Optional是一个final类,未实现任何接口,所有程序中利用Optional包装定义类的属性时,如果定义的类有对象序列化的需求,由于Optional类没有实现Serializable接口,此时对象序列化操作会有问题:
class User implements Serializable { private long id; private String name; private Optional<Long> phone;//不能对象序列化 } //替换策略 class User implements Serializable { private long id; private String name; private Long phone;//不能对象序列化 public Optional<Long> getPhone(){ return Optional.ofNullable(this.phone); } }
-
本身只是一个容器类工具,普通方法跟简单的话,实际上是没必要使用的,不要为使用而使用了
-