在实际业务中我们总是需要对一些数据进行判空处理,采用一些if-else进行不同逻辑的处理。
而在jdk8之后推出了Optional来进行判空的处理,简化了代码的书写。
Optional
是一个容器类(本身可以使用流函数),用于表示一个值存在或不存在。它的主要作用是解决 Java 代码中常见的 NullPointerException
(空指针异常)问题,从而使代码更加健壮和可读
如何创建
public static <T> Optional<T> of(T var0) {
return new Optional(var0);
}
public static <T> Optional<T> ofNullable(T var0) {
return var0 == null ? empty() : of(var0);
}
public static <T> Optional<T> empty() {
Optional var0 = EMPTY;
return var0;
}
对于生成Optional类则是通过Optional类的静态方法来实现的,静态方法一共有三种of,ofNullable,empty。
Optional<String> string1 = Optional.of("测试"); //正常运行
Optional<String> string2 = Optional.of(null); //运行时候报错
对于of方法传递值的时候不能为空,如果为空则在运行的时候直接抛出空指针异常
Optional<String> string1 = Optional.ofNullable("测试"); //正常运行
Optional<String> string2 = Optional.ofNullable(null); //正常运行
对于ofNullable方法则是无论传递是否为null都不会报错
Optional<String> string1 = Optional.empty(); //正常运行
对于empty函数则是用于创建一个空的 Optional
实例,表示 “没有值” 的状态。它相当于一个容器,明确声明其中不包含任何元素
如何使用
上述介绍了如何创建Optional对象,下面我们来介绍一下Optional常用的几个api方法
string1.map(e->e.toUpperCase());
string1.get();
string1.filter(e->e.equals("测试"));
string1.ifPresent(System.out::println);
boolean present = string1.isPresent();
String s = string1.orElse(null);
上述几个常用的api中
map函数:作用和stream流的map函数一样目的是对原来的集合进行类型的转化
get函数:作用是获取当前的Optional内的值,如果 Optional
本身为空(即通过 Optional.empty()
创建或不包含任何值),调用 get()
会立即抛出 NoSuchElementException
filter函数:也是与stream流函数基本一样,目的是过滤掉不符合条件的数据保留符合条件的数据
ifPresent函数:作用是当前Optional内值如果存在则调用内部的方法,用于在 Optional
包含值时执行指定操作,并在值缺失时静默跳过。
isPresent函数:判断当前Optional内是否有值有则返回true没有则返回false
orElse函数:它的核心作用是:当 Optional
包含值时返回该值,否则返回指定的默认值。例如上述代码如果Optional内不含有当前值那么则会直接返回括号内部的值也就是null
使用实例:
正常业务判断逻辑
public String test1(String str){
if(str!=null){
return str+" 测试";
}else{
return null;
}
}
使用Optional的判断逻辑
public String test1(String str){
return Optional.ofNullable(str)
.map(s -> s + " 测试")
.orElse(null);
}
可以看出采用Optional则是简化了代码的书写无需再使用if-else。