网易首页 > 网易号 > 正文 申请入驻

JDK8 的判空就是这么爽!

0
分享至

阿粉相信大家肯定所有的开发者都对Java8里面的所有的东西都感兴趣,虽然目前的 JDK 已经更新到 JDK17 了,但是阿粉相信,现在很多公司使用的还都是 JDK8 甚至是 JDK7,但是,就算是有些公司已经升级到 JDK8 但是对于 JDK8 里面的一些东西的使用,却没有使用的淋漓尽致。阿粉今天就给大家放出几个 JDK8 里面比较好用的。

JDK8

大家都是知道 JDK8 就开始使用 Lambda 表达式,但是很多不管是在教程上还是在其他的书籍上,都没有说在实际开发的时候去使用上这个 Lambda 表达式,而且包括 JDK8 里面的一些新的类,也都没有引入,所以阿粉在这里想要给大家安利一波使用方面的知识。

Optional类

这个类对于大家来说,是一个非常重要的类,不知道大家有没有被 java.lang.NullPointerException 疯狂的折磨过,不管是新人开发还是老开发,遇到这个问题的时候,都是头大的很,因为我们要在代码里面去疯狂的判断是否是null,如果不是 null 需要怎么处理,如果是 null 需要怎么处理,反正就是你要是想解决 java.lang.NullPointerException 这个问题,就免不了去加一些判断条件,而 Optional 这个类,则是帮你优雅的处理 null 的问题。

我们先看一组 Java7 中的一些判断空的实现:


User user = usersMapper.selectUserById(userId);
String userName = user.getUserName();
if(user!= null){
if(userName != null && !userName.isEmpty()){


阿粉相信大家一定都写过这个样子的代码,因为我们不知道SQL查询出来的数据中是否包含了我们的 Users 对象,如果要是 Users 对象,那么就会无情的出现 java.lang.NullPointerException 这个空指针异常,这时候就很尴尬了,老开发一脸懵逼,我竟然还有的地方没有验证?

但是验证了之后,你就会发现代码量是非常的大,而且有点不太美观,我们再来对比一下 JDK8 中,给我们提供的方法来进行验证的方式。

User user = usersMapper.selectUserById(userId);
Optional.ofNullable(user)
.map(User::getUserName)
.ifPresent(userName->{

大家看这种链式编程,ofNullable() 方法给我们提供了判断 user 是不是空,并且去校验 userName,如果存在,然后执行下面的逻辑,相比较 JDK7 的内容,相信大家看起来的话肯定是没有 JDK7 中的表现的那么的明显,但是大家看代码是不是发现已经被处理的妥妥的了。而且非常的优雅。

相信大家肯定都看过一些教程,上面会写到:

User user = usersMapper.selectUserById(userId);
Optional userOptional = Optional.ofNullable(user);
Optional str = userOptional.map(User::getUserName);

但是相对于代码的可读性来说,我们肯定还是希望使用 JDK7 上面的判断来进行判断,但是这种 JDK8 的链式编程,在一定程度上减少了代码量,并且开发效率也会相对应的提升。

如果大家不信,我们可以来运行一下我们的代码,然后看一下效果。

Optional.ofNullable(user)
.map(User::getUserName)
.ifPresent(userName->{
System.out.println("用户UserName不为空");

大家看,是不是就出现了我们想要的结果,一个判断 null 的操作,瞬间变得高大上了,而且代码的逼格瞬间上升一个档次。

对于 Optional 类,在 Java8 实战中给出了很多的方法,阿粉也是给大家摘取了一下,做了个总结,

  • ofNullable 方法 :将指定值用Optional封装之后返回,如果该值为null,则返回一个空的Optional对象

  • empty 方法 :返回一个空的Optional实例

  • filter 方法 :如果值存在并且满足提供的谓词,就返回包含该值的Optional对象;否则返回一个空的 Optional对象

  • flatMap 方法 :如果值存在,就对该值执行提供的mapping函数调用,返回一个Optional类型的值,否则就返 回一个空的Optional对象

  • get 方法 :如果该值存在,将该值用Optional封装返回,否则抛出一个NoSuchElementException异常

  • ifPresent 方法 :如果值存在,就执行使用该值的方法调用,否则什么也不做

  • isPresent 方法 :如果值存在就返回true,否则返回false

  • map 方法 :如果值存在,就对该值执行提供的mapping函数调用

  • of 方法 :将指定值用Optional封装之后返回,如果该值为null,则抛出一个NullPointerException异常

  • orElse 方法:如果有值则将其返回,否则返回一个默认值

  • orElseGet 方法 :如果有值则将其返回,否则返回一个由指定的Supplier接口生成的值

  • orElseThrow 方法 :如果有值则将其返回,否则抛出一个由指定的Supplier接口生成的异常

大家看这些方法是不是都有很多相似的,比如 map,flatMap,还有orElse,orElseGet,orElseThrow 方法

map 和 flatMap 比较:

这两个都是做 转换值 的操作,区别就是入参的类型不是一样的,map的入参是Function mapper而 flatMap 入参则是Function > mapper

入参的不同也就导致了他们获取返回值也是不同的,map中获取的返回值自动被Optional包装,flatMap中返回值保持不变,但必须是Optional类型。

这么一看总是感觉不太对的样子,我们去源码里面看看是什么样子的。

map:
public Optional map(Function mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Optional.ofNullable(mapper.apply(value));

flatMap:
public Optional flatMap(Function> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Objects.requireNonNull(mapper.apply(value));

map 方法参数中的函数 mapper 输出的是值,然后 map 方法会使用 Optional.ofNullable 将其包装为 Optional;而 flatMap 要求参数中的函数 mapper 输出的就是 Optional。

一个是比较聪明的,另外一个就相对来说不是那么聪明了,人家会自己包装呀,是不是?

同样的比较还有 orElse,orElseGet,orElseThrow 但是这个阿粉就不再给大家絮叨了,因为上面的方法解释上都很明显的能看到了。

Lambda 表达式

Lambda 表达式实际上就是相当于是一个匿名内部类,他就是让我们开发的人把函数当成参数传递给某个方法,然后把代码当做数据去处理。

阿粉相信大家肯定都了解这块,就比如说下面的代码对比:

Java7:
List stringList = Arrays.asList("1", "2", "3");
for (String st:stringList) {
System.out.println(st);
Java8:
Arrays.asList("1", "2", "3").forEach((String st)->{
System.out.println(st);

同样的一个循环,我们肯定想用第二种写法不是么?

Java8 实际上在从发布开始,很多公司都在用,但是也有很多人依旧选择是 Java7,因为不想改变自己的学习风格,阿粉相信大家如果是一个决心在开发领域一直做下去的人,那么肯定会保持一个不断学习的心,所以,你是这样的人么?

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
恩波格斗再次声明称“被王宝强一方哄骗”,记者探访:俱乐部仍正常训练

恩波格斗再次声明称“被王宝强一方哄骗”,记者探访:俱乐部仍正常训练

极目新闻
2024-11-22 16:44:39
近两周涨超240%,止步13连板!这只“妖股”盘后宣布:公司控股股东完成变更

近两周涨超240%,止步13连板!这只“妖股”盘后宣布:公司控股股东完成变更

21世纪经济报道
2024-11-22 21:24:23
NBA杯赛开拓者客场挑战火箭 艾顿&亨德森缺阵

NBA杯赛开拓者客场挑战火箭 艾顿&亨德森缺阵

直播吧
2024-11-23 07:51:30
曾被吹上天,如今却跌落神坛的6个国产

曾被吹上天,如今却跌落神坛的6个国产

梦录的西方史话V
2024-11-23 07:30:22
两性:当女人羞羞时,“咪咪”会发生什么变化?全看男人怎么操作

两性:当女人羞羞时,“咪咪”会发生什么变化?全看男人怎么操作

喜马拉雅主播暮霭
2024-06-18 00:05:58
迈阿密国际官方:主教练马蒂诺因私人原因辞职

迈阿密国际官方:主教练马蒂诺因私人原因辞职

雷速体育
2024-11-23 00:02:27
兰州交通大学曝出丑闻,学生情侣在公共场所楼梯行不雅行为

兰州交通大学曝出丑闻,学生情侣在公共场所楼梯行不雅行为

说真话的小陈
2024-11-22 16:23:45
中国稀土太子爷的奢靡生活:90万一顿饭,父子俩挥霍上百亿资产

中国稀土太子爷的奢靡生活:90万一顿饭,父子俩挥霍上百亿资产

铁锤简科
2024-11-21 22:01:11
1-2!C罗打进第911个进球,奥巴梅杨破门:利雅得胜利遭遇首败

1-2!C罗打进第911个进球,奥巴梅杨破门:利雅得胜利遭遇首败

郝小小看体育
2024-11-23 07:22:47
梁惠玲主持召开龙粤对口合作工作机制会议

梁惠玲主持召开龙粤对口合作工作机制会议

金台资讯
2024-11-22 22:58:07
抢七2比6到10比8!中国小花挽救4盘点,力克6号种子,挺进四强

抢七2比6到10比8!中国小花挽救4盘点,力克6号种子,挺进四强

曹老师评球
2024-11-22 15:50:49
中国首台、世界最大吨位,航空发动机关键部件制造设备交付

中国首台、世界最大吨位,航空发动机关键部件制造设备交付

IT之家
2024-11-22 12:10:07
70岁姜黎黎自然老去太真实!不医美,不扮嫩,一身老人打扮很舒服

70岁姜黎黎自然老去太真实!不医美,不扮嫩,一身老人打扮很舒服

时髦范
2024-11-14 22:56:09
娘家拆迁款940万,叫我和妹妹回家分钱,妹妹却说:这钱我不要了

娘家拆迁款940万,叫我和妹妹回家分钱,妹妹却说:这钱我不要了

娱乐洞察点点
2024-11-22 20:50:18
中国“已读不回”,立陶宛有点慌,也有点烦!

中国“已读不回”,立陶宛有点慌,也有点烦!

趣说世界哈
2024-11-22 22:39:52
最坏情况要来?朝鲜发出前所未有警告,俄代表紧急抵达,局势危急

最坏情况要来?朝鲜发出前所未有警告,俄代表紧急抵达,局势危急

视野聚椒
2024-11-19 14:44:18
武汉网红沉浮记,火遍中国的湖北6大天王巨星,如今还有几人在?

武汉网红沉浮记,火遍中国的湖北6大天王巨星,如今还有几人在?

娱乐的小灶
2024-11-22 16:23:52
泰国男模亲口讲述被玩成废人的经历,福利多但也令人发指

泰国男模亲口讲述被玩成废人的经历,福利多但也令人发指

千山万松
2023-09-28 14:32:27
50年,聂荣臻致信毛主席,撤销徐向前职务,主席:向前同意可照办

50年,聂荣臻致信毛主席,撤销徐向前职务,主席:向前同意可照办

幻梦人生
2024-11-20 00:25:02
全球钻石价格再跌40%!美钻商巨头负债3亿,美媒:中国坏规矩!

全球钻石价格再跌40%!美钻商巨头负债3亿,美媒:中国坏规矩!

沧海阅铭
2024-11-21 16:06:40
2024-11-23 08:15:00
中国尊下的打工仔
中国尊下的打工仔
不定时更新Java知识
26文章数 167关注度
往期回顾 全部

科技要闻

能者归来,蒋凡重回阿里电商权力中心

头条要闻

俄军首次向乌发射"无法拦截"导弹 美媒:打不到美国

头条要闻

俄军首次向乌发射"无法拦截"导弹 美媒:打不到美国

体育要闻

1年半夺2冠!迈阿密主帅马蒂诺因私人原因辞职

娱乐要闻

受王宝强资助孩子父亲发声

财经要闻

祝宝良:增量政策可使明年GDP增长5%左右

汽车要闻

对话张纯伟:80万!捷途立了一个新Flag

态度原创

教育
房产
旅游
时尚
军事航空

教育要闻

动点杠上系列,新定义问题怕不怕?

房产要闻

楼市新周期启航!盯紧核芯性价比之选,抢滩价值洼地!

旅游要闻

莲花山滑雪场向摄影界、新闻界免费开放!

明年开年这个盛会,含金量还在上涨!

军事要闻

俄版"和平方案"披露:乌放弃加入北约

无障碍浏览 进入关怀版