- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章JDK8中Optional类巧用之判空操作由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
相信大家肯定所有的开发者都对java8里面的所有的东西都感兴趣,虽然目前的 jdk 已经更新到 jdk17 了,但是我相信,现在很多公司使用的还都是 jdk8 甚至是 jdk7,但是,就算是有些公司已经升级到 jdk8 但是对于 jdk8 里面的一些东西的使用,却没有使用的淋漓尽致。 今天就给大家放出几个 jdk8 里面比较好用的.
大家都是知道 jdk8 就开始使用 lambda 表达式,但是很多不管是在教程上还是在其他的书籍上,都没有说在实际开发的时候去使用上这个 lambda 表达式,而且包括 jdk8 里面的一些新的类,也都没有引入,所以阿粉在这里想要给大家安利一波使用方面的知识.
这个类对于大家来说,是一个非常重要的类,不知道大家有没有被 java.lang.nullpointerexception 疯狂的折磨过,不管是新人开发还是老开发,遇到这个问题的时候,都是头大的很,因为我们要在代码里面去疯狂的判断是否是null,如果不是 null 需要怎么处理,如果是 null 需要怎么处理,反正就是你要是想解决 java.lang.nullpointerexception 这个问题,就免不了去加一些判断条件,而 optional 这个类,则是帮你优雅的处理 null 的问题.
我们先看一组 java7 中的一些判断空的实现:
1
2
3
4
5
6
7
|
user user = usersmapper.selectuserbyid(userid);
string username = user.getusername();
if
(user!= null){
if
(username != null && !username.isempty()){
.....
}
}
|
阿粉相信大家一定都写过这个样子的代码,因为我们不知道sql查询出来的数据中是否包含了我们的 users 对象,如果要是 users 对象,那么就会无情的出现 java.lang.nullpointerexception 这个空指针异常,这时候就很尴尬了,老开发一脸懵逼,我竟然还有的地方没有验证?
但是验证了之后,你就会发现代码量是非常的大,而且有点不太美观,我们再来对比一下 jdk8 中,给我们提供的方法来进行验证的方式.
1
2
3
4
5
6
|
user user = usersmapper.selectuserbyid(userid);
optional.ofnullable(user)
.map(user::getusername)
.ifpresent(username->{
....
}
|
大家看这种链式编程,ofnullable() 方法给我们提供了判断 user 是不是空,并且去校验 username,如果存在,然后执行下面的逻辑,相比较 jdk7 的内容,相信大家看起来的话肯定是没有 jdk7 中的表现的那么的明显,但是大家看代码是不是发现已经被处理的妥妥的了。而且非常的优雅.
相信大家肯定都看过一些教程,上面会写到:
1
2
3
4
|
user user = usersmapper.selectuserbyid(userid);
optional<user> useroptional = optional.ofnullable(user);
optional<string> str = useroptional.map(user::getusername);
....
|
但是相对于代码的可读性来说,我们肯定还是希望使用 jdk7 上面的判断来进行判断,但是这种 jdk8 的链式编程,在一定程度上减少了代码量,并且开发效率也会相对应的提升.
如果大家不信,我们可以来运行一下我们的代码,然后看一下效果.
1
2
3
4
5
|
optional.ofnullable(user)
.map(user::getusername)
.ifpresent(username->{
system
.out.println(
"用户username不为空"
);
});
|
大家看,是不是就出现了我们想要的结果,一个判断 null 的操作,瞬间变得高大上了,而且代码的逼格瞬间上升一个档次.
对于 optional 类,在 java8 实战中给出了很多的方法,阿粉也是给大家摘取了一下,做了个总结, 。
大家看这些方法是不是都有很多相似的,比如 map,flatmap,还有orelse,orelseget,orelsethrow 方法 。
map 和 flatmap 比较:
这两个都是做 转换值 的操作,区别就是入参的类型不是一样的,map的入参是 function<? super t, ? extends u> mapper 而 flatmap 入参则是 function<? super t, optional<u> > mapper .
入参的不同也就导致了他们获取返回值也是不同的,map中获取的返回值自动被optional包装,flatmap中返回值保持不变,但必须是optional类型.
这么一看总是感觉不太对的样子,我们去源码里面看看是什么样子的.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
map:
public
<u> optional<u> map(function<? super t, ? extends u> mapper) {
objects.requirenonnull(mapper);
if
(!ispresent())
return
empty();
else
{
return
optional.ofnullable(mapper.apply(value));
}
}
flatmap:
public
<u> optional<u> flatmap(function<? super t, optional<u>> 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 表达式实际上就是相当于是一个匿名内部类,他就是让我们开发的人把函数当成参数传递给某个方法,然后把代码当做数据去处理.
阿粉相信大家肯定都了解这块,就比如说下面的代码对比:
1
2
3
4
5
6
7
8
9
10
11
12
|
java7:
list<string> 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);
});
|
同样的一个循环,我们肯定想用第二种写法不是么?
va8
1
2
3
|
arrays.aslist(
"1"
,
"2"
,
"3"
).foreach((string st)->{
system
.out.println(st);
});
|
同样的一个循环,我们肯定想用第二种写法不是么?
java8 实际上在从发布开始,很多公司都在用,但是也有很多人依旧选择是 java7,因为不想改变自己的学习风格,阿粉相信大家如果是一个决心在开发领域一直做下去的人,那么肯定会保持一个不断学习的心,所以,你是这样的人么?
到此这篇关于jdk8中optional类巧用之判空的文章就介绍到这了,更多相关jdk8 optional类判空内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/qq_44866828/article/details/119961399 。
最后此篇关于JDK8中Optional类巧用之判空操作的文章就讲到这里了,如果你想了解更多关于JDK8中Optional类巧用之判空操作的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我对第一个问题的直觉是肯定的。对于第二个问题,我在工作中确实看到,有人使用 JDK8 和 ANT,然后将用 JDK6 编写的旧包编译到 1.6。我真的很困惑。 最佳答案 一般来说,java 向后兼容所
据我所知,在windows中使用JDK有两种方式: 下载JDK安装文件并安装。 下载 JDK 二进制文件。 它们有什么区别? 最佳答案 优点:简单易行,突然间一切正常。 缺点:现在一切都使用新版本 -
我正在安装 HANA Studio,并且已下载 JDK 1.8 和 JDK 1.7。我将 JDK 1.8 用于 Eclipse 和我正在处理的其他一些事情,但是当我尝试通过 SAP HANA 生命周期
JDK 7 的哪些特性(不包括 invokedynamic,因为它不被 java 使用)导致新的类文件版本与 JDK 6 不兼容。似乎所有特性都可以通过编译器生成胶水代码来实现。例如 switch 语
在redhat机器上安装cloudera的库来创建cloudera集群是否必须使用Oracle JDK而不是Open JDK? 最佳答案 在撰写本文时,只有 Oracle JDK 版本经过认证可与 C
下面的语句在 Java 7 中有效吗? Timestamp.valueOf("0000-00-00 00:00:00.000000"); 因为使用 JDK 1.6 构建上述代码效果很好,但在使用 JD
更新 在整个评论中,结果证明我采用的基准测试方法是不正确的,因此结果具有误导性。纠正我的方法后(如已接受的答案),结果正如人们所期望的 - JDK 13 的性能与 JDK 11 一样好。有关更多详细信
我们很快就会从 jdk14 迁移到 jdk16。我们的是桌面应用程序。我需要采取什么措施来确保它在客户端机器上正常工作?现在他们中的一些人使用 JRE4 和一些 JRE6.Server-Solaris
我在/usr/lib/jvm 中有 jdk1.7.0 目录以及其他 open-jdk 版本。我希望我的 Ubuntu 12.04 将此 jdk(jdk1.7.0) 视为其主要 jdk,即我不想使用 o
我认为这可能与 Why does a generic cast of a List to List succeed on Sun JDK 6 but fail to compile on Oracle
代码使用 JDK 8 (1.8.0_212) 编译良好,但使用 JDK 11 (11.0.3) Oracle jdk 和 open jdk (aws corretto) 编译失败 尝试使用 javac
是否可以在 cygwin 上安装任何版本的 Sun JDK 或 Open JDK。 我寻找此选项的原因是:有许多工具(例如 jStack、jMap)在 JDK 的 unix 版本中可用,但在 wind
请确认以上说法? 当他们提到 JDK 时,我需要知道他们指的是什么。 最佳答案 Java Development Kit 是我们通常指的一组创建 Java 应用程序的工具,包括 Java Compil
使用 java -version 给我这个。 java version "1.7.0_80" Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
这个问题在这里已经有了答案: JAVA_HOME should point to a JDK not a JRE (25 个答案) 关闭 4 年前。 您好,感谢您提供的任何帮助。 我刚刚升级到 Ub
没错,自阿里、腾讯之后,华为也终于开源了自家的 JDK——毕昇 JDK! 免费!免费!免费!!! Oracle 要慌了? 毕昇 JDK 毕昇 JDK 是华为内部 OpenJDK 定制版 Hu
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭去年。 Improve this quest
将 Arquillian 添加到 Maven 构建时,我在 Eclipse 中遇到上述异常: Missing artifact sun.jdk:jconsole:jar:jdk
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 5 年前。 Improve this ques
我正在尝试创建一个 pom,它将: 使用 maven-toolchains-plugin 中的正确 JDK基于 java.version 属性。 根据 maven-toolchains-plugin
我是一名优秀的程序员,十分优秀!