一、概述
它是jdk1.8提供的一个容器对象,其目的之一是对null值对象做更好的判断和处理,其二是适应lambda表达式编程风格,四大函数式接口Function,Supplier,Consumer,Predicate在Optional方法中均有使用。
二、构造函数
1.空对象 Optional.empty()
2.包含value对象 Optional.of(value)
3.无法确定是否为null Optional.ofNullable(obj)
三、方法
1.T orElse(T other)
如果内部value不为null,返回value,否则返回other
Optional<Student> optional = StudentDao.findById(1);
Student student = optional.orElse(new Student());
2.public T orElseGet(Supplier<? extends T> other)
如果内部value不为null,返回value,否则other supplier调用返回
Student student = Optional.ofNullable(getCacheById(1)).orElseGet(() -> StudentService.findById(1))
3.public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X
如果内部value不为null,返回value,否则抛出异常
Optional<Student> optional = StudentDao.findById(1);
Student student = optional.orElseThrow(() -> new RuntimeException("resource are not found!"));
4.boolean isPresent()
判断元素是否存在
Optional<Student> optional = StudentDao.findById(1);
if (optional.isPresent()) {
// do something
}
5.public void ifPresent(Consumer<? super T> consumer)
存在消费此value,不存在不做任何事
Optional<Student> optional = StudentDao.findById(1);
optional.ifPresent(s -> System.out.println(s.getName()));
6.public Optional<T> filter(Predicate<? super T> predicate)
过滤元素,不通过,返回EMPTY
Optional<Student> optional = StudentDao.findById(1);
boolean liExisted = optional.filter(s -> s.getName().contains("li")).isPresent();
7.public<U> Optional<U> map(Function<? super T, ? extends U> mapper)
转换为另一种类型对象
Optional<FileInputStream> fis =
names.stream().filter(name -> !isProcessedYet(name))
.findFirst()
.map(name -> new FileInputStream(name));
四、原始类型Optional
OptionalLong 、OptionalInt 、OptionalDouble
OptionalLong.of(111).ifPresent(System.out::println);
五、注意事项
1.Optional内部维护一个静态final EMPTY对象
private static final Optional<?> EMPTY = new Optional<>();
Optional.empty()方法返回这个对象,但是不要通过比较是否等于EMPTY判断一个Optional对象是否为空,应该通过isPresent()方法。
2.这是一个基于值value的对象,使用唯一身份识别操作时(包括地址引用相等==,唯一hashcode方法,或者多线程同步调用)在Optional的实例上都可能产生不可避免的结果,应该减少此类方法的使用。