Optional
是 Java 8 引入的新特性之一,它是一个容器类,代表一个可能包含或者不包含实际对象的值。其目的是为了减少代码中空指针异常(NullPointerException
)的发生,并使得代码更加安全和易读。使用 Optional 可以避免直接返回 null,从而减少空值检查。
Optional对象的创建
Optional 类提供了几种创建方式:
Optional.of(T value)
:当值非 null 时使用此方法创建 Optional 对象,如果传入 null,将抛出 NullPointerException。
Optional.empty()
:创建一个没有值的 Optional 对象。
Optional.ofNullable(T value)
:允许传入 null 值,如果值为 null,则返回一个空的 Optional,否则返回包含该值的 Optional。
我们一般采用第三种方式创建Optional对象
demo
Author author = getAuthor();
Optional<Author> authorOptional = Optional.ofNullable(author);
Optional.ofNullable的等价写法
public static Optional<Author> getAuthorOptional(){
Author author = new Author(1L, "蒙多", 33, "eee", null);
//return Optional.ofNullable(author); //这种创建Optional的方法可以等价于下面这种
return author == null ? Optional.empty() : Optional.of(author);
}
我们一般使用Optional的静态方法ofNullable来把数据封装成一个Optional对象,无论传入的参数是否为null都不会出现问题
安全的消费值
我们获取Optional对象后肯定需要对其中的数据进行使用,这时候我们可以使用ifPresent
方法来消费其中的值。该方法会判断封装的数据是否为空,不为空时才执行具体的消费代码,这样就更加安全了。
demo
import java.util.Optional;
import java.util.function.Consumer;
public class OptionalDemo {
public static void main(String[] args) {
Author author = getAuthor();
Optional<Author> authorOptional = Optional.ofNullable(author);
authorOptional.ifPresent(author12 -> System.out.println(author12.getName()));
}
}
获取值
我们可以通过get方法获取值。如果存在值,则返回该值,否则抛出 NoSuchElementException.很显然,因为可能抛出异常,所以我们不推荐这种方式。
import java.util.Optional;
import java.util.function.Consumer;
public class OptionalDemo {
public static void main(String[] args) {
Optional<Author> authorOptional1 = getAuthorOptional();
Author author1 = authorOptional1.get();
System.out.println(author1);
}
public static Optional<Author> getAuthorOptional(){
Author author = new Author(1L, "蒙多", 33, "eee", null);
return Optional.ofNullable(author); //这种创建Optional的方法可以等价于下面这种
//return author == null ? Optional.empty() : Optional.of(author);
}
}
安全获取值
orElseGet(Supplier<T> supplier)
:如果有值则返回该值,否则返回由 Supplier 提供的值。
Optional<Author> authorOptional1 = getAuthorOptional();
authorOptional1.orElseGet(new Supplier<Author>() {
@Override
public Author get() {
return new Author();
}
});
orElseThrow(Supplier<? extends Throwable> exceptionSupplier)
:如果有值则返回该值,否则抛出由 Supplier 创建的异常。
Optional<Author> authorOptional1 = getAuthorOptional();
authorOptional1.orElseThrow((Supplier<Throwable>) () -> new RuntimeException("数据为null"));
过滤
filter(Predicate<T> predicate)
:参考Stream
判断
isPresent()
:如果存在值则返回 true
数据转换
map
方法接收一个函数作为参数,并将其应用于Optional中的值,返回一个新的Optional对象,该对象包含应用函数后的结果。如果原始的Optional对象为空,则返回的Optional也是空的。参考Stream