Optional类可以更友好的处理null问题,将if(xxx == null)等类似代码变得更简洁;
Optional类包含的内容:(jdk1.8)
构造Optional类:
Optional类构造方法都是私有的,只能通过Optional类提供的三个静态方法构造:
- empty():返回一个空值的Optional实例;
- of(T value):返回值为value的Optional实例,value为null抛出空指针异常;
- ofNullable(T value):返回值为value或者空值的Optional实例,当value为null时相当于empty();
Optional类提供的方法:(jdk1.8)
- public boolean equals(Object obj)
判断两个Optional是否相等,相等条件:前提两边都是Optional实例,两边值都为空值或者两边值的equals()相等;
- public String toString()
value是空值返回“Optional.empty”,否则返回“Optional[value值]”;
- public T get()
返回value的值,value不存在抛出NoSuchElementException异常;
- public T orElse(T other)
返回value的值,value不存在返回other;
- public T orElseGet(Supplier<? extends T> other)
返回value的值,value不存在返回指定Supplier接口返回的值,value不存在且supplier为null抛出空指针异常;
- public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X
返回value的值,value不存在抛出supplier指定的异常,value不存在且supplier为null抛出空指针异常;
- public boolean isPresent()
判断value值是否存在,存在返回true,不存在返回false;
- public void ifPresent(Consumer<? super T> consumer)
如果值存在则执行consumer,值存在且consumer为null时抛出空指针异常;
- public<U> Optional<U> map(Function<? super T, ? extends U> mapper)
对value进行映射,返回映射后的Optional实例,如果mapper返回null则映射为空的Optional实例,mapper为null抛出空指针异常;
- public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)
跟map基本一样,不过mapper需返回一个Optional对象,mapper为null或者返回null都将抛出空指针异常;
- public Optional<T> filter(Predicate<? super T> predicate)
如果值存在并且符合predicate条件则返回当前Optional,否则返回一个空的Optional实例,predicate为null抛出空指针异常;
高版本jdk额外的方法:
- public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)
jdk9新增,如果值存在则执行action,否则执行emptyAction,值存在且action为null或者值不存在切emptyAction为null都将抛出空指针异常;
- public boolean isEmpty()
jdk11新增,判断值是否不存在,空值返回true,非空值返回false;(跟isPresent()相反)
- public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)
jdk9新增,跟orElseGet基本一样,只是返回值不同,supplier也需返回Optional对象;
- public T orElseThrow()
jdk10新增,值存在返回该Optional对象,否则返回NoSuchElementException异常;
- public Stream<T> stream()
jdk9新增,将Optional转换成steam对象;
小demo:
/**
* 2022年1月6日下午2:25:25
*/
package testOptional;
import java.util.Optional;
/**
* @author XWF
*
*/
public class TestOptional {
/**
* @param args
*/
public static void main(String[] args) {
Optional<String> opt = Optional.empty();
System.out.println("isEmpty:" + opt.isEmpty());
System.out.println("isPresent:" + opt.isPresent());
opt.ifPresentOrElse(x -> System.out.println("opt=" + x), () -> System.out.println("opt不存在"));
System.out.println(opt.orElse("abc"));
System.out.println(opt.or(() -> Optional.of("DEF")).map(String::toLowerCase));
System.out.println("===========================");
opt = Optional.of("XYZ");
opt.ifPresent(x -> System.out.println(x + x));
System.out.println(opt.filter(x -> x.length() > 5));
System.out.println(opt.filter(x -> x.length() <= 5));
opt.stream().forEach(System.out::println);
}
}
执行结果: