- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java关于JDK1.8中的Optional类由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
Optional是一个容器,它可以保存类型T的值,或者仅仅保存null,Optional类主要是用来避免空指针异常(NPE),其提供的一系列的方法配合Lambda表达式可以让代码更加清晰,语义化,以及避免了空指针异常的问题,这里要注意是避免空指针异常,而不是避免返回null.
empty 方法返回一个不包含值的Optional实例,注意不保证返回的empty是单例,不要用==比较.
public static<T> Optional<T> empty() 。
of 方法返回一个Optional实例,传入的值必须是非空值,传入null会抛出空指针异常.
public static <T> Optional<T> of(T value) 。
如果传入值非空,则实例中包含非空值,如果传入null,返回不包含值的empty 。
public static <T> Optional<T> ofNullable(T value) 。
用来判断实例是否包含值,如果不包含非空值返回false,否则返回true 。
public boolean isPresent(),
如果实例包含值则返回当前值,否则抛出NoSushElementException 异常. 。
public T get(),
不推荐调用上面两个方法,因为容易写出如下代码,比原先判断if null的代码还要脏 。
1
2
3
4
5
6
7
|
public
static
String getUserName1(User user) {
Optional<User> user1 = Optional.ofNullable(user);
if
(!user1.isPresent()) {
return
"参数为空"
;
}
return
user1.get().getName();
}
|
下面是用if-null 。
1
2
3
4
5
6
|
public
static
String getUserName(User user) {
if
(user ==
null
) {
return
"参数为空"
;
}
return
user.getName();
}
|
(Consumer consumer):如果option对象保存的值不是null,则调用consumer对象,否则不调用 。
public void ifPresent(Consumer<? super T> consumer),
代码示例:
1
2
3
4
5
6
|
Optional<Integer> optional1 = Optional.ofNullable(
1
);
Optional<Object> optional2 = Optional.ofNullable(
null
);
//如果不是null,调用Consumer
optional1.ifPresent(t -> System.out.println(
"value is"
+ t));
//value is1
//如果是null,不调用Consumer
optional2.ifPresent(t -> System.out.println(
"value is "
+ t));
|
如上代码,输出结果是 第一条 语句输出value is1,第二条语句没有输出 。
如果值存在,并且这个值匹配给定的predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional 。
Optional<T> filter(Predicate<? super <T> predicate) 。
代码示例:
1
2
3
4
5
6
7
8
9
|
Optional<Integer> optional1 = Optional.ofNullable(
1
);
Optional<Object> optional2 = Optional.ofNullable(
null
);
Optional<Integer> filter1 = optional1.filter(a -> a ==
null
);
Optional<Integer> filter2 = optional1.filter((a) -> a ==
1
);
Optional<Object> filter3 = optional2.filter(a -> a ==
null
);
System.out.
println
(filter1.isPresent());
//false
System.out.
println
(filter2.isPresent());
//true
System.out.
println
(filter2.
get
().intValue() ==
1
);
//true
|
如上代码,演示了filter方法如何使用,输出结果如代码注释所示.
对Optional中保存的值进行函数运算,并返回新的Optional(可以是任何类型) 。
public<U> Optional<U> map(Function<? super T, ? extends U> mapper),
代码示例:输出结果已经写在注释中.
1
2
3
4
5
6
|
Optional<Integer> optional1 = Optional.ofNullable(
1
);
Optional<Object> optional2 = Optional.ofNullable(
null
);
Optional<String> str1Optional = optional1.map(a ->
"key"
+ a);
Optional<String> str2Optional = optional2.map(a ->
"key"
+ a);
System.out.println(str1Optional.get());
//key1
System.out.println(str2Optional.isPresent());
//false
|
功能与map()相似,差别在返回值不同,flatMap方法的mapping函数返回值可以是任何类型T,而map方法的mapping函数必须是Optional 。
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper),
代码示例:
1
2
3
4
5
6
|
Optional<Integer> optional1 = Optional.ofNullable(
1
);
Optional<Object> optional2 = Optional.ofNullable(
null
);
Optional<Optional<String>> str11Optional = optional1.map(a -> Optional.of(
"key"
+ a));
Optional<String> str22Optional = optional1.flatMap(a -> Optional.of(
"key"
+ a));
System.out.println(str11Optional.get().get());
//key1
System.out.println(str22Optional.get());
//key1
|
如果optional对象保存的值不是null,则返回原来的值,否则返回value.
public T orElse(T other),
代码示例:
1
2
3
4
|
Optional<Integer> optional1 = Optional.ofNullable(
1
);
Optional<Object> optional2 = Optional.ofNullable(
null
);
System.out.println(optional1.orElse(
1000
) ==
1
);
//true
System.out.println((Integer) optional2.orElse(
1000
) ==
1000
);
//true
|
功能与orElse一样,只不过orElseGet参数是一个对象。 。
public T orElseGet(Supplier<? extends T> other),
代码示例:
1
2
3
4
|
Optional<Integer> optional1 = Optional.ofNullable(
1
);
Optional<Object> optional2 = Optional.ofNullable(
null
);
System.out.println(optional1.orElseGet(() ->
1000
) ==
1
);
//true
System.out.println((Integer) optional2.orElseGet(() ->
1000
) ==
1000
);
//true
|
值不存在则调用传入的Supplier参数,生成一个异常实例并抛出,这个方法通常与全局异常处理器一起使用,当参数或者其他情况获取不到值是,抛出自定义异常,由异常处理器处理成通用返回结果.
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier),
代码示例:
1
2
3
4
5
6
7
8
9
10
|
optional1.orElseThrow(() -> {
throw
new
IllegalStateException();
});
try
{
optional2.orElseThrow(() -> {
throw
new
IllegalStateException();
});
}
catch
(IllegalStateException e) {
e.printStackTrace();
}
|
假设我们要解析一段json字符串,按照传统的if-null方式我们需要做如下处理:为了获取CUid的值,我们必须要判断三次.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public
static
String getOrgUid(String orgResult) {
if
(StringUtils.isBlank(orgResult)) {
return
null
;
}
JSONObject jsonObject = JSON.parseObject(orgResult);
if
(jsonObject ==
null
) {
return
null
;
}
if
(
"success"
.equals(jsonObject.getString(
"result"
))) {
return
jsonObject.getString(
"CUid"
);
}
return
null
;
}
|
而运用了我们的Optional类之后,我们可以通过函数式变成来实现.
1
2
3
4
5
6
7
8
9
10
11
|
public
static
String getNewUid(String orgResult) {
String orElse = Optional.ofNullable(orgResult)
.map(n -> JSONObject.parseObject(n))
.map(a -> {
if
(
"success"
.equals(a.getString(
"result"
))) {
return
a.getString(
"CUid"
);
}
return
null
;
}).orElse(
null
);
return
orElse;
}
|
运用了函数式变成,我们只需要三段3段代码就能轻松的驾驭,代码简洁明了.
到此这篇关于Java关于JDK1.8中的Optional类的文章就介绍到这了,更多相关Java的Optional类内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://feige.blog.csdn.net/article/details/104385258 。
最后此篇关于Java关于JDK1.8中的Optional类的文章就讲到这里了,如果你想了解更多关于Java关于JDK1.8中的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
我是一名优秀的程序员,十分优秀!