Optional类是Java8为了解决null值判断问题,借鉴google guava类库的Optional类而引入的一个同名Optional类,使用Optional类可以避免显式的null值判断(null的防御性检查),避免null导致的NPE(NullPointerException)。总而言之,就是对控制的一个判断,为了避免空指针异常。
一、引言
首先我们看下面一段代码,肯定会很熟悉
public static String getGender(Student student){if(null == student){return "Unkown";}return student.getGender();}
从上面看出,就是对这个实例是不是空做了判断,然后我们看下使用java8 的Optional类之后的代码,挺实用的。
public static String getGender(Student student){return Optional.ofNullable(student).map(u -> u.getGender()).orElse("Unkown");}
二、Optional类介绍
Optional 类主要特点说明下:
- 构造方法是私有,不能new来创建,
- Optional的三个静态方法来创建对象,【empty()、of()、ofNullable()】
// 1、创建一个包装对象值为空的Optional对象
Optional<String> optStr = Optional.empty();
// 2、创建包装对象值非空的Optional对象
Optional<String> optStr1 = Optional.of("optional");
// 3、创建包装对象值允许为空的Optional对象
Optional<String> optStr2 = Optional.ofNullable(null);
三、Optional类的使用
1. get方法
直接放回包装对象的实际值,为null抛出异常
2. isPresent方法
判断包装对象是否为空
3. ifPresent方法
不为空时进行操作,内部自动判断null处理
public static void printName(Student student){Optional.ofNullable(student).ifPresent(u -> System.out.println("The student name is : " + u.getName()));}
4. filter方法
用于对Optional对象进行过滤
public static void filterAge(Student student){Optional.ofNullable(student).filter( u -> u.getAge() > 18).ifPresent(u -> System.out.println("The student age is more than 18."));}
5. map方法
map()方法的参数为Function(函数式接口)对象,map()方法将Optional中的包装对象用Function函数进行运算,并包装成新的Optional对象。
public static Optional<Integer> getAge(Student student){return Optional.ofNullable(student).map(u -> u.getAge()); }
6. flatMap方法
map()方法不同的是,入参Function函数的返回值类型为Optional<U>类型,而不是U类型,这样flatMap()能将一个二维的Optional对象映射成一个一维的对象。
public static Optional<Integer> getAge(Student student){return Optional.ofNullable(student).flatMap(u -> Optional.ofNullable(u.getAge()));
}
7. orElse方法
如果包装对象值非空,返回包装对象值,否则返回入参other的值(默认值)。
public static String getGender(Student student){return Optional.ofNullable(student).map(u -> u.getGender()).orElse("Unkown");}
8. orElseGet方法
orElseGet()方法与orElse()方法类似,区别在于orElseGet()方法的入参为一个Supplier对象,用Supplier对象的get()方法的返回值作为默认值。
public static String getGender(Student student){return Optional.ofNullable(student).map(u -> u.getGender()).orElseGet(() -> "Unkown"); }
9. orElseThrow方法
用于包装对象值为空时需要抛出特定异常的场景。
public static String getGender1(Student student){return Optional.ofNullable(student).map(u -> u.getGender()).orElseThrow(() -> new RuntimeException("Unkown")); }
Optional开发时要注意正确使用Optional格式,谨慎使用isPresent()和get()方法,尽量多使用map()、filter()、orElse()等方法来发挥Optional的作用。