一、Optional简介
Optional是Java 8中引入的一个新类,属于java.util包下面,用来解决空指针异常问题。在我们日常开发过程中,空指针异常是比较常见的异常。尤其是当我们处理复杂的对象时,有可能会出现对象为空的情况。在Java 8之前,为了避免空指针异常,我们需要先判断对象是否为空,再进行相应的操作。但是这种做法毕竟比较繁琐。而Optional则是一种更加优雅的解决方案。
二、Optional的用法
1.创建Optional对象
Optional是一个泛型类,可以用来包装任意类型的对象。下面是创建Optional对象的几种方式:
//创建一个包装了空值的Optional对象 OptionalemptyOptional = Optional.empty(); //创建一个包装了非空值的Optional对象 Optional strOptional = Optional.of("hello world"); //创建一个包装了可空值的Optional对象 Optional nullableOptional = Optional.ofNullable(null);
2.获取Optional对象中的值
获取Optional对象中的值有两种方式,一种是使用get()方法,另一种是使用orElse()方法。如果Optional对象中的值为空,使用get()方法会抛出NoSuchElementException异常,而使用orElse()方法则会返回一个默认值。
//直接获取Optional对象中的值,如果值为空,抛出NoSuchElementException异常 String str1 = strOptional.get(); //获取Optional对象中的值,如果值为空,返回一个默认值 String str2 = emptyOptional.orElse("default value");
3.判断Optional对象中是否存在值
判断Optional对象中是否存在值可以使用isPresent()方法。如果存在值则返回true,否则返回false。
boolean isPresent = strOptional.isPresent();
4.在Optional对象中执行操作
Optional对象提供了一些方法,可以在Optional对象中执行操作。这些方法包括:
4.1 ifPresent()
ifPresent()方法接收一个Consumer函数式接口作为参数,如果Optional对象中存在值,则执行该函数式接口,否则不做任何操作。
strOptional.ifPresent(s -> System.out.println(s));
4.2 filter()
filter()方法接收一个Predicate函数式接口作为参数,用来过滤Optional对象中的值。如果Predicate函数式接口返回true,则表示Optional对象中的值符合要求,否则表示不符合要求。
OptionalfilteredOptional = strOptional.filter(s -> s.length() > 10);
4.3 map()
map()方法接收一个Function函数式接口作为参数,用来对Optional对象中的值进行转换。如果Optional对象中的值不为空,则将其传入Function函数式接口,并返回一个新的Optional对象。
OptionallengthOptional = strOptional.map(s -> s.length());
4.4 flatMap()
flatMap()方法接收一个Function函数式接口作为参数,用来对Optional对象中的值进行转换。和map()方法类似,不同的是,返回值类型是一个Optional对象。
OptionalflatLengthOptional = strOptional.flatMap(s -> Optional.ofNullable(s.length()));
4.5 orElseGet()
orElseGet()方法和orElse()方法类似,不同的是,它接收一个Supplier函数式接口作为参数,用来返回一个默认值。
String orElseGetResult = emptyOptional.orElseGet(() -> "default value");
4.6 orElseThrow()
orElseThrow()方法和orElse()方法类似,不同的是,它会抛出一个指定的异常,而不是返回一个默认值。该方法接收一个Supplier函数式接口作为参数,用来返回一个异常实例。
String orElseThrowResult = emptyOptional.orElseThrow(() -> new IllegalArgumentException("value is null"));
三、Optional的优缺点
3.1 优点
- 解决空指针异常问题
- 提供一种优雅的写法,避免了繁琐的if判断
3.2 缺点
- 可能会引起一些新的问题,如当我们使用Optional对象时,可能会忘记检查是否存在值,从而导致NoSuchElementException异常。
- 需要学习一些新的概念,如容器、流等。
四、总结
本文介绍了Java 8中的Optional类,包括创建Optional对象、获取Optional对象中的值、判断Optional对象中是否存在值、在Optional对象中执行操作、Optional的优缺点等方面。Optional是一种解决空指针异常问题的优雅方式,但是它也存在着一些缺点。在使用Optional时,需要注意它的特点,并且掌握一些必要的概念,才能更好的发挥它的作用。