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 类主要特点说明下:
// 1、创建一个包装对象值为空的Optional对象
Optional optStr = Optional.empty();
// 2、创建包装对象值非空的Optional对象
Optional optStr1 = Optional.of("optional");
// 3、创建包装对象值允许为空的Optional对象
Optional optStr2 = Optional.ofNullable(null);
直接放回包装对象的实际值,为null抛出异常
判断包装对象是否为空
不为空时进行操作,内部自动判断null处理
public static void printName(Student student){
Optional.ofNullable(student).ifPresent(u -> System.out.println("The student name is : " + u.getName()));
}
用于对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."));
}
map()方法的参数为Function(函数式接口)对象,map()方法将Optional中的包装对象用Function函数进行运算,并包装成新的Optional对象。
public static Optional getAge(Student student){
return Optional.ofNullable(student).map(u -> u.getAge());
}
map()方法不同的是,入参Function函数的返回值类型为Optional类型,而不是U类型,这样flatMap()能将一个二维的Optional对象映射成一个一维的对象。
public static Optional getAge(Student student){
return Optional.ofNullable(student).flatMap(u -> Optional.ofNullable(u.getAge()));
}
如果包装对象值非空,返回包装对象值,否则返回入参other的值(默认值)。
public static String getGender(Student student){
return Optional.ofNullable(student).map(u -> u.getGender()).orElse("Unkown");
}
orElseGet()方法与orElse()方法类似,区别在于orElseGet()方法的入参为一个Supplier对象,用Supplier对象的get()方法的返回值作为默认值。
public static String getGender(Student student){
return Optional.ofNullable(student).map(u -> u.getGender()).orElseGet(() -> "Unkown");
}
用于包装对象值为空时需要抛出特定异常的场景。
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的作用。