引言
Null Pointer Exception空指针异常在Java中可以说是很常见了,所以一般会在代码逻辑中进行if判空;Java8新特性中有一个Optional类在一些情况下可以更加优雅的进行判空处理,下面简单介绍一下常用的几个方法;
创建Optional类
创建Optional类有三个方法(都是静态方法):
empty()
创建一个空的Optional对象,没有任何参数赋值;
Optional<Object> optionalEmpty = Optional.empty(); // 创建一个空的Optional类
of(T t)
创建一个非空的Optional对象,且参数t不能为空;
String str = "Hello World";
Optional<String> optionalStr = Optional.of(str); // str不能为空
*ofNullable(T t)
参数t可以为空,如果为空创建一个Optional空对象,如果非空创建对应有参数的对象;
从源码中可以看到,如果参数value为空则调用了empty()方法创建空对象,非空使用of()方法创建非空对象;可以说这个方法就是把上面两种方法整合到一起了;
该方法也是最常用的一个,所以一定要掌握这个方法;
String str = "Hello World";
Optional<String> optionalStr = Optional.ofNullable(str); // str可以为空
只会创建Optional看不出来有什么用,下面就看看如何使用Optional对象;
判断Optional类中是否有对象
Optional支持泛型,其实就可以把Optional类看成一个容器,内部可以放各种类型的对象;那么下面就看看如何操作这些对象;
isPresent()
该方法可以判断Optional类中的对象是否为空;
value就是创建Optional类时给它赋的值;该方法返回值是一个布尔类型;
boolean present = Optional.ofNullable(null).isPresent(); // present为false
ifPresent(Consumer<? super T> consumer)
该方法的参数是Consumer函数式接口,是Lambda表达式里面的知识点,如果不了解可以学习一下,这里就不过多介绍了;
如果Optional对象中有值,则调用Consumer接口实现的代码,如果为空,不会有返回结果;
Optional.ofNullable("hello").ifPresent(System.out::println); // 输出hello
Optional.ofNullable(null).ifPresent(System.out::println); // 什么也不输出
上面两种方法我在实际情况中也没有怎么用过,以后用到了再补充;
获取Optional类中的对象
一开始创建Optional对象时我们把值传入其中的目的就是为了使用Optional的一些方法/操作来让我们代码更优雅,之后还是要获取到传入的对象的;
get()
返回Optional对象中的实例值,如果实例值为空,即是一个空的Optional对象,那么抛出异常;
源码还是比较容易看懂的;
String str = Optional.ofNullable("hello").get(); // str为hello
Object o = Optional.ofNullable(null).get(); // 抛出异常:java.util.NoSuchElementException: No value present
*orElse(T other)
这个方法对我来说也是比较常用的;作用是如果Optional类有实例值那么就返回该值,如果没有则返回传入的参数other的值;
String s1 = Optional.ofNullable("hello").orElse("string is null"); // s1为hello
Object s2 = Optional.ofNullable(null).orElse("string is null"); // s2为string is null
// 假设有一个User自定义类型:
User user = null;
User ansUser = Optional.ofNullable(user).orElse(new User("张三", 11, "男", 1234)); // 输出为new User("张三", 11, "男", 1234)对象
项目中应用:
orElseGet(Supplier<? extends T> other)
这个方法的参数是Supplier,同样是一个函数式接口,不过多介绍;
如果Optional类有实例值那么就返回该值,没有就返回Supplier接口实现提供的对象;
这个方法没用过,用到了再补充;
String str = Optional.ofNullable("hello").orElseGet(() -> "test"); // str为hello
*orElseThrow(Supplier<? extends X> exceptionSupplier)
这个方法也比较好用,功能是Optional类有实例值那么就返回该值,没有就抛出指定的异常;参数类型还是Supplier;
String s = null;
String str = Optional.ofNullable(s).orElseThrow(RuntimeException::new); // 抛出异常:java.lang.RuntimeException
之前我喜欢在些项目中用if判断前端传入参数是否为空,为空抛出自定义的异常:
现在可以尝试替换成如下:
以后有什么应用再补充;
总结
Optional不仅只有我列举的这些方法,这几种比较常见,其余有的方法和stream流的方法很相似就不说了;
当然有了Optional这些方法并不是说可以替换不适用if判断空指针了,还是要根据实际情况,选择最方便简洁的一种才行;