Optional
java.util.Optional
为解决空引用异常引入的,用于封装单值元素的容器(single-value container),一个容器内最多只能装一个值,该值可以为空。
即,基于Optional提供的一系列方法,操作封装在Optional容器中的,可能引起空引用的元素对象
创建容器
ofNullable() / of()
执行操作,基于容器是否为空,执行操作,无返回值
ifPresent() / ifPresentOrElse()
中间操作,将操作结果,置于新Optional容器以执行后续操作,结果为空,也会返回相同类型的空容器
filter() / map() / or()(需手动创建容器注入)
获取操作,获取容器中对象
orElse() / orElseGet() / get()
判断方法,判断当前容器是否为空
isEmpty() / isPresent()
Creating Optional Objects
Optional<T> Optional.of(T value),基于必不为空对象,创建optional容器,注入为空元素将抛出NullPointerException异常
Optional<T> Optional.ofNullable(T value),基于可能为空的对象,创建optional容器
private static void create(){
USB u1 = new USB("键盘");
USB u2 = new USB("鼠标");
USB u3 = null;
Optional<USB> usb1 = Optional.ofNullable(u1); // 相当于:
// Optional<USB> usb1 = Optional.of(u1);
Optional<USB> usb2 = Optional.ofNullable(u2);
Optional<USB> usb3 = Optional.ofNullable(u3); // 不可以用
// Optional<USB> usb3 = Optional.of(u3); 因为现在的u3是空指针。
}
ifPresent()
当容器不空执行指定函数,为空或则忽略执行。
private static void create(){
USB u1 = new USB("键盘");
USB u2 = new USB("鼠标");
USB u3 = null;
Optional<USB> usb1 = Optional.ofNullable(u1);
Optional<USB> usb2 = Optional.ofNullable(u2);
Optional<USB> usb3 = Optional.ofNullable(u3);
usb1.ifPresent(usb -> {System.out.println(usb.getName());});
// 当Optional容器不空的时候执行的函数;
}
Void ifPresentOrElse(, )
2个函数的参数,当容器不为空时执行第一个函数;为空执行第二个函数
Java9才有。
private static void create(){
USB u1 = new USB("键盘");
USB u2 = new USB("鼠标");
USB u3 = null;
Optional<USB> usb1 = Optional.ofNullable(u1);
Optional<USB> usb2 = Optional.ofNullable(u2);
Optional<USB> usb3 = Optional.ofNullable(u3);
usb1.ifPresentOrElse(usb -> {System.out.println(usb.getName());}, () -> System.out.println("空"));
// 当Optional容器不空的时候执行第一个函数, 否则之心发第二个函数。
}
Optional filter()
过滤容器中元素。容器为空,返回空容器;容器不为空,执行过滤;符合条件,将对象置于新容器,不符合条件,返回空容器
即,无论是否匹配,均返回一个容器,用于后续操作
public static void main(String[] args){
USB u1 = new USB("键盘");
USB u2 = new USB("鼠标");
USB u3 = null;
Optional<USB> usb1 = Optional.ofNullable(u1);
Optional<USB> usb2 = Optional.ofNullable(u2);
Optional<USB> usb3 = Optional.ofNullable(u3);
usb1.filter(usb -> "键盘".equals(usb.getName()))
.ifPresent(usb -> System.out.println(usb.getName()));
}
Optional map()
基于容器中对象,映射。容器为空,返回相同类型的空容器;容器不为空,执行映射函数,将映射结果封装在新容器中
即,无论是否匹配,均返回一个容器,用于后续操作
public static void main(String[] args){
USB u1 = new USB("键盘");
USB u2 = new USB("鼠标");
USB u3 = null;
Optional<USB> usb1 = Optional.ofNullable(u1);
Optional<USB> usb2 = Optional.ofNullable(u2);
Optional<USB> usb3 = Optional.ofNullable(u3);
usb1.map(USB::getName)
.ifPresent(System.out::println);
}
Optional or()
容器为空,执行函数,且必须返回一个,相同类型的容器,可以为空容器
public static void main(String[] args){
USB u1 = new USB("键盘");
USB u2 = new USB("鼠标");
USB u3 = null;
Optional<USB> usb1 = Optional.ofNullable(u1);
Optional<USB> usb2 = Optional.ofNullable(u2);
Optional<USB> usb3 = Optional.ofNullable(u3);
usb1.or(() -> {return Optional.ofNullable(new USB("xin"));})
.ifPresent (u -> {System.out.println(u.getName());});
}
T get()
public static void main(String[] args){
USB u1 = new USB("键盘");
USB u2 = new USB("鼠标");
USB u3 = null;
Optional<USB> usb1 = Optional.ofNullable(u1);
Optional<USB> usb2 = Optional.ofNullable(u2);
Optional<USB> usb3 = Optional.ofNullable(u3);
System.out.println(usb1.get().getName());
}
其他的方法
Default Value With,T orElse()/orElseGet()
返回容器中对象,容器为空,则创建默认对象替代
T orElseGet(supplier),容器为空时,执行函数,且必须返回容器中相同类型对象;容器不为空不执行
T orElse(T other),无论是否为空,均创建默认对象
返回的不再是Optional容器,而是容器中最终的元素对象
Exceptions with orElseThrow(),当为空时,抛出指定异常