谈谈Java Optional的坑

开端:

大家好,我是老白。昨天朋友提出的java8后出来的自带的对象判定方式Optional.ofNullable(),后来查询了一些资料和自己试验了一些demo资料,在这里记录分享个大家

作用:判断对象是否为空,是则重新创建一个新对象,防止空指针。省略if/else

操作:

使用:
在这里插入图片描述

上面代码是市面上大部分人写的demo实例。代码有的会不同,不过大致意思一样。

注意:很多人了解不多就直接使用,有的甚至用来去判断集合和string。但是这在实战中根本不可取,下面演示并说明下。

集合操作:大家可以猜一下,第一个实例代码会报什么?

public static void main(String[] args) {
    List<OpenDevicePanTypeDTO> lists = new ArrayList<>();
    List<OpenDevicePanTypeDTO> lists2 = Optional.ofNullable(lists).orElse(Collections.emptyList());
    List<OpenDevicePanTypeDTO> lists3=new ArrayList<>();
    lists3.add(lists2.get(0));
}

在这里插入图片描述

是的,下标越界,因为他没有处理。而我们实战中是如何使用的:

在这里插入图片描述

使用CollectionUtils.isEmpty(),属于:import org.springframework.util.CollectionUtils;它不光是可以判断集合时候为null,还可以判定集合size>0。有的童鞋不理解两者区别,看下面:

nullList<OpenDevicePanTypeDTO> lists = null;
size=0List<OpenDevicePanTypeDTO> lists = new ArrayList<>();

字符串操作:只能判断空,但是我们正常传输中会有String s=" ";的数据,这些数据能回特殊处理或者跳过执行,和集合实战操作同理。这里具体代码就不贴了。

总结:

不推荐使用,只能判断对象,而省略掉的if/else在某种程度上,虽然是优化了代码却是造成了更多的问题。同时更多的对象new出,造成内存的开销很大。并且在后来的资料查询中发现很长时间没有更新了(最新版为java11)。从22年java19出现,多个版本未发生变化,不知道是否已经放弃。而国内市面上流行的版本依旧是Java8,也就是说9-11的新特性是无法使用的

Java Optional的演变史

Java 8

其他有用的方法包括:

of(T value),这类似于ofNullable(T value)但是应该只在您希望从非空值创建可选值时使用。

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

filter(Predicate<? super T> predicate)

如果value出现在我们的可选实例中,那么它们的工作方式与它们在Stream interface中的工作方式相同。

ifPresent(Consumer<? super T> consumer)

它接受消费者接口,并在可选值出现时调用它,否则它什么也不做。

orElseThrow(Supplier<? extends X> exceptionSupplier)

它接受供应商接口,如果该值不存在,它抛出一个由供应商创建的异常。

我故意没有描述Java 8 Optional中的所有方法,因为本文主要关注的是后续版本中添加的内容,而不是它在开始时的样子。如果您希望更熟悉所有方法,请查看Oracle官方文档.

Java 9

这是我们旅程的第一站。

该版本为我们的API带来了数量最多的新方法,即:

ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)

这里的定义非常简单,如果值存在,它将对它应用一个消费者动作,否则它执行一个提供的runnable动作。

or(Supplier<? extends Optional<? extends T>> supplier)

如果该值不存在,该方法将返回由供应商函数提供的可选值。

stream()

这里的定义也很明显。如果我们的值存在,它会将我们的可选值转换成包含该值的流。如果没有,我们得到空流。这种转换使我们能够访问Stream API中声明的所有方法,它比可选的API更强大,提供了更多的功能。

Java 10

不幸的是,在这个版本中,Oracle决定只给可选类添加一个新方法。一方面,它似乎很有用,但另一方面,却没那么有用。我将描述它,并让您来评价它的有用性。

orElseThrow()

H在这里,这将引发的异常n为我们定义了因此我们有不必须指定它。如果我们决定引起这种方法对空、O可选we将得到NoSuchElementException.

Java 11

最新的Java LTS版本是我们的下一站。

这里,我们又一次只有一个新方法。在我看来,这不是很有用。

它有以下签名isEmpty()与此相反我在场()自Java 8以来就存在的方法。准确地说,如果value不在我们的可选实例中,它将返回True。

Java 12及以上版本

不幸的是,自Java 11以来,可选API没有任何更新。我们将不得不等待Java 18版本发布内容计划,因为据我所知,在Java 18中没有为这个API计划进一步的变化。如果出现这样的变化,本文将会更新

**创作不易,如果这篇文章对你有用,请点赞。有其他建议请在下方留言评论,谢谢♪(・ω・)ノ!**
  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你可以叫我老白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值