Java-Optional类
Java-Optional类
前言
Optional 对象是一种包装器对象,要么包装了类型T的对象,要么没有包装任何对象。使用Optional主要是帮我们解决最烦人的NPE问题,相信大家在写代码过程中为了防止NPE一定用过很多的If 语句进行判断,而Optional类的出现就是为了帮我们更优雅的解决这类问题,提高代码的可读性。
一、Optional类是什么?
Optional主要是为了帮助我们解决npe问题,很多地方都会推荐我们使用Optional类来解决空指针异常的问题,我们通常的做法就是用if语句去判断是否为空,然后抛异常或是其他处理,而Optional可以帮我们更优雅的去做非空检查。
常用Optional api
二、Optional常用api
1. empty
返回一个空的Optional实例。 此可选项不存在值。实际过程中用的很少
public static void empty() {
Optional<Object> empty = Optional.empty();
Optional<License> license = Optional.empty();
System.out.println(empty);
System.out.println(license);
// 输出都是 Optional.empty
}
2. of
返回具有 Optional的当前非空值的Optional。 如果为空,直接抛出异常
public static void of() {
License license = new License();
license.setId(1);
Optional<Integer> id = Optional.of(license.getId());
System.out.println(id);
}
// 输出 Optional[1] 注释掉setId()的情况直接抛异常
3. ofNullable
返回一个 Optional指定值的Optional,如果非空,则返回一个空的 Optional 。
4. get
如果 Optional中存在值,则返回值,否则抛出 NoSuchElementException 。
没有值存在抛出异常 NoSuchElementException
5. isPresent
public boolean isPresent()如果存在值,则返回 true ,否则为 false 。
6. ifPresent
public void ifPresent(Consumer<? super T> consumer)如果存在值,则使用该值调用指定的消费者,否则不执行任何操作。
7. filter
public Optional filter(Predicate<? super T> predicate)如果一个值存在,并且该值给定的谓词相匹配时,返回一个 Optional描述的值,否则返回一个空的 Optional 。
8. map
public Optional map(Function<? super T,? extends U> mapper)如果存在值,则应用提供的映射函数,如果结果不为空,则返回一个Optional结果的Optional 。 否则返回一个空的Optional 。
9. flatMap
public Optional flatMap(Function<? super T,Optional> mapper)如果一个值存在,应用提供的Optional映射函数给它,返回该结果,否则返回一个空的Optional 。 这种方法类似于map(Function) ,但是提供的映射器是一个结果已经是Optional映射器,如果被调用, flatMap不会用额外的Optional 。
10. orElse
public T orElse(T other)返回值如果存在,否则返回 other 。
11. orElseGet
public T orElseGet(Supplier<? extends T> other)返回值(如果存在),否则调用 other并返回该调用的结果。
12. orElseThrow
public T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X extends Throwable
返回包含的值(如果存在),否则抛出由提供的供应商创建的异常。
public static void orElseThrow() {
License license = new License();
license.setId(123);
license.setLicenseCount(100);
license.setBusiness("ActiveCount");
Integer id = Optional.ofNullable(license.getId()).
orElseThrow(() -> new ServiceException("id不能为空"));
String business = Optional.ofNullable(license.getBusiness()).
filter(s -> !s.isEmpty()).
orElseThrow(() -> new ServiceException("业务类型不能为空"));
Integer licenseCount = Optional.ofNullable(license.getLicenseCount()).
orElseThrow(() -> new ServiceException("license数量不能为空"));
System.out.println(id);
System.out.println(business);
System.out.println(licenseCount);
}
总结
orElseThrow是本人目前用的最多的,建议只用Optional在返回值的情况,其他的方法也很灵活,比如map和flatmap等。
注意点: