Java8 Optional的正确打开方式

本文详细介绍了Java8 Optional的正确使用方法,包括避免直接使用isPresent()进行if检查,不在方法参数和POJO中使用Optional,以及慎用Optional.get()。推荐使用orElse(), orElseGet(), orElseThrow()等方法,以及ifPresent()来处理空值。文章强调了Optional的主要目的是优雅地处理可能的空值,不应滥用,并指出在某些场景下,如集合类型和POJO中,使用Optional可能并不适合。" 100726436,7577602,Python网络爬虫:正则表达式与Re库实战,"['Python编程', '网络爬虫', '正则表达式', '数据提取', '信息处理']
摘要由CSDN通过智能技术生成

Optional的正确用法

基础理解

首先,Optional是一个容器,用于放置可能为空的值,它可以合理而优雅的处理null。众所周知,null在编程历史上极具话题性,号称是计算机历史上最严重的错误,感兴趣可以读一下这篇文章:THE WORST MISTAKE OF COMPUTER SCIENCE,这里暂且不做过多讨论。在 Java 1.8 之前的版本,没有可以用于表示null官方 API,如果你足够的谨慎,你可能需要常常在代码中做如下的判断:

if (null != user) {
   
    //doing something
}
if (StringUtil.isEmpty(string)) {
   
    //doing something
}

确实,返回值是null的情况太多了,一不小心,就会产生 NPE,接踵而来的就是应用运行终止,产品抱怨,用户投诉。

1.8 之后,jdk 新增了Optional来表示空结果。其实本质上什么也没变,只是增加了一个表达方式。Optional表示空的静态方法为Optional.empty(),跟null有什么本质区别吗?其实没有。翻看它的实现,Optional中的 value 就是null,只不过包了一层Optional,所以说它其实是个容器。用之后的代码可能长这样:

// 1
Optional<User> optionalUser = RemoteService.getUser();
if (!optionalUser.isPresent()) {
   
   //doing something 
}
User user = optionalUser.get();

// 2
User user = optionalUser.get().orElse(new User());

看起来,好像比之前好了一些,至少看起来没那么笨。但如果采用写法 1,好像更啰嗦了。

下面先说一些在我看来不合适的使用方式:

Bad Practice

1. 直接使用 isPresent() 进行 if 检查

这个直接参考上面的例子,用if判断和 1.8 之前的写法并没有什么区别,反而返回值包了一层Optional,增加了代码的复杂性,没有带来任何实质的收益。其实isPresent()一般用于流处理的结尾,用于判断是否符合条件。

list.stream()
    .filer(x -> Objects.equals(x,param))
    .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值