Java 8 引入了一个新的类——Optional,它可以有效地解决null指针异常。Optional可以提高代码的可读性,降低代码出现空指针异常的风险。
一、Optional简介
Optional是一个容器,它可以保存任意类型的值。Optional可以包含一个非null的值,也可以包含null。当Optional包含一个非null的值时,调用者可以使用get()方法取出这个值;如果Optional为空,那么调用者可以指定一个默认值来代替这个null。Optional提供了一些有用的API来方便程序员的编程。
二、Optional的使用
1、创建Optional对象
Optional类中提供了如下几种用于创建Optional对象的静态工厂方法。
// 创建一个值为空的Optional对象 Optional emptyOptional = Optional.empty(); // 创建一个值非空的Optional对象 OptionalnotNullOptional = Optional.of("value"); // 创建一个值允许为空的Optional对象 Optional nullableOptional = Optional.ofNullable("value"); Optional emptyNullableOptional = Optional.ofNullable(null);
2、判断Optional是否为空
Optional类中提供了isPresent()方法,用来判断Optional是否非空。如果值存在则返回true,否则false。
Optionaloptional = Optional.ofNullable("value"); if (optional.isPresent()) { System.out.println("Optional不为空"); }
3、获取Optional中的值
Optional类提供了get()方法来获取Optional中的值。如果Optional不为空,则返回封装的对象;否则抛出NoSuchElementException。
Optionaloptional = Optional.ofNullable("value"); String value = optional.get(); System.out.println(value);
4、当Optional为空时,设定默认值
Optional提供了一个orElse()方法,当Optional为空时可以指定一个默认值。
OptionalnullableOptional = Optional.ofNullable(null); String orElse = nullableOptional.orElse("default"); System.out.println(orElse);
5、当Optional为空时,使用Supplier提供的默认值
orElseGet()方法与orElse()方法类似,当Optional为空时提供一个默认值。但是提供默认值的方式不同,orElse()方法会在Optional为空时创建默认值并返回,orElseGet()则会接受一个Supplier函数式接口,在Optional为空时,调用Supplier提供的方法进行计算并返回计算结果。
OptionalnullableOptional = Optional.ofNullable(null); String orElse = nullableOptional.orElseGet(() -> "supplier"); System.out.println(orElse);
6、当Optional为空时抛出异常
orElseThrow()方法与orElse()方法类似,当Optional为空时会抛出一个由Supplier函数式接口提供的异常对象,或者抛出提供的异常类的异常对象。
OptionalnullableOptional = Optional.ofNullable(null); String orElse = nullableOptional.orElseThrow(() -> new RuntimeException("异常"));
三、Optional的优势及适用场景
Optional为程序员提供了一种新的处理null的方式,它的引入,可以更好地将代码中的某些特殊情形暴露出来,有助于代码的维护和调试。
Optional可以在某些情况下提高代码的可读性,可以更加清楚地表达出null的含义,避免了很多的判null处理,从而简化了代码。
Optional适用于返回结果为空的情况,并且这种空情况必须详细处理,因为使用Optional会强制程序员处理掉这种情况,从根本上解决null引起的问题。