Optional的作用
显示的告诉调用者这个值有可能是空值,需要显示的判断,避免出现空指针的异常。
例如:
public class People {
//一个人,肯定是有头的
private String head ;
//但是一个人不一定有帽子,
private Optional<String> hat ;
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public Optional<String> getHat() {
return hat;
}
public void setHat(Optional<String> hat) {
this.hat = hat;
}
}
在用户调用getHat()方法时,返回的是一个optional对象,调用者就意识到这个值有可能是空,需要进行null校验,避免出现空指针;相反调用getHead()方法时,返回的就是String,表示在这个对象中,head属性是不可能为空的,通过这种方式可以更好的理解一个对象中哪些属性是必然不为空的,而不是获取对象中每个属性都要去判断
Optional API
获取Optional对象
- Optional.empty() 创建空对象
- Optional.of() 根据一个值获取对象,注:如果传入的对象是一个控制,会报空指针异常 而不是在使用这个对象时才报空指针
- Optional.ofNullable 根据一个值创建一个允许为null的对象,但是获取optional里面的对象时如果利用get方法获取里面的值时会报NoSuchElementException,应该用其他安全的方法获取里面的值
//创建空对象;
Optional<String> optStr = Optional.empty();
String s = "123";
//根据一个值创建对象
optStr = Optional.of(s);
try {
//如果传入的值为空会立即抛出空指针异常
optStr = Optional.of(null);
} catch (NullPointerException e) {
System.out.println("catch NullPointerException");
}
//利用ofNullable方法创建允许对象是null,在获取optional里面的值时返回的是空对象
optStr = Optional.ofNullable(null);
//利用ofNullable方法创建允许对象是null,在获取optional里面的值时返回的是空对象
Optional<String> optStr2 = Optional.ofNullable(null);
try {
optStr2.get();
} catch (NoSuchElementException e) {
System.out.println("catch NoSuchElementException ");
}
Optional的一些流处理
Optional提供一些数据处理的API,例如Optional.map(),Optional.filter;
Optioanl里的方法与stream里面的api类似,最大的好处在于会对里面的值进行安全(空值)过滤;看下面代码:
//filter 在使用Optional.filter的时候不会打印出+号,在filter时会自动过滤掉值为空的Optional
Optional<String> opt = Optional.ofNullable(null);
boolean a = opt.filter(str->{
System.out.println("+++++++++++++");
return 1 == str.length();
}).isPresent();
System.out.println("------filter test ----"+a);
//map方法转换里面的值
Optional<String> opt3 = Optional.ofNullable(null);
Optional<Integer> o = opt3.map(String::length);
控制台不会打出+号,opt3.map(String::length)或者str.length();不会因为我们在创建opt时传入的null造成空指针
Optional的取值
方法 | 描述 |
---|---|
get | 最简单但又最不安全的方法。如果变量存在,它直接返回封装的变量值,否则就抛出一个NoSuchElementException异常 |
orElse | 允许你在Optional对象不包含值时提供一个默认值 |
orElseGet | 默认值比较复杂时使用,延迟加载默认值 |
orElseThrow | 允许在Optional对象不包含值时抛出一个异常 |
ifPresent | 传入一个方法,在有值的时候调用 |
isPresent | 判断optional里面是否有有效元素 |
//是这些方法中最简单但又最不安全的方法。如果变量存在,它直接返回封装的变量
//值,否则就抛出一个NoSuchElementException异常
opt4.get();
//允许在Optional对象不包含值时提供一个默认值
opt4.orElse("default");
//默认值比较复杂时使用,延迟加载默认值
opt4.orElseGet(OptionalDemo::getFromDb);
//允许在Optional对象不包含值时抛出一个异常
opt4.orElseThrow(OptionalDemo::getMyException);
//传入一个方法,在有值的时候调用
opt4.ifPresent(System.out::println);
//判断optional里面是否有有效元素
boolean exit = optStr.isPresent();