Java基础、中级、高级、架构面试资料

java.util.Optional 详解

JAVA herman 5523浏览 0评论
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

java.util.Optional<T> 是 java 8 中推出来的一个新类,主要用来解决空异常 NullPointerException 的问题,但它也不算真正的解决,还是可以返回 null 和 抛出空异常的。公司很多新人都会用,但他们都无法说明这个类到底是干什么的?于是就有了本文,希望通过本文方便大家理解!

说起空异常 NullPointerException 这注定又是一个一说就明白,一讲就糊涂,一讨论就翻天的问题。所以我早就想整理这篇文章了。

Optional 类

Optional 类是一个可以为 null 的容器对象。它是个容器,所以它可以保存类型T的值,或者仅仅保存 null。Optional 的诞生,可以让我们不用显式进行空值检测。

Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。但是 Optional 的意义显然不止于此。

public final class Optional<T> {}

Optional 的方法

Java 8 中 Optional 类的主要方法大概有 15 个,在 java 9 中,又引入了 3 个新方法。java 8 中的方法,具体如下:

序号 方法 & 描述
1 static <T> Optional<T> empty()

返回空的 Optional 实例。

2 boolean equals(Object obj)

判断其他对象是否等于 Optional。

3 Optional<T> filter(Predicate<? super <T> predicate)

如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。

4 <U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)

如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional

5 T get()

如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException

6 int hashCode()

返回存在值的哈希码,如果值不存在 返回 0。

7 void ifPresent(Consumer<? super T> consumer)

如果值存在则使用该值调用 consumer , 否则不做任何事情。

8 boolean isPresent()

如果值存在则方法会返回true,否则返回 false。

9 <U>Optional<U> map(Function<? super T,? extends U> mapper)

如果存在该值,提供的映射方法,如果返回非null,返回一个Optional描述结果。

10 static <T> Optional<T> of(T value)

返回一个指定非null值的Optional。

11 static <T> Optional<T> ofNullable(T value)

如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。

12 T orElse(T other)

如果存在该值,返回值, 否则返回 other。

13 T orElseGet(Supplier<? extends T> other)

如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。

14 <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)

如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常

15 String toString()

返回一个Optional的非空字符串,用来调试

在以前,我们判断一个非空的值,层级多的多,代码就非常的沉余,难以维护。如下:

if(null != xttblog){
	if(null != xttblog.getName()){
		System.out.println("业余草");
	}
}

如果我们使用 Optional 类,就可以用下面的方法来进行:

Optional.of(xttblog).map(Xttblog::getName).ifPresent(System.out::println);

Optional 类用到了工厂方法的设计模式,比如 Optional.of(null) 和 Optional.ofNullable(null)。

更多的用法建议大家多去实践!

参考资料

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » java.util.Optional 详解