Java8 Optional
程序员文章站
2022-03-04 10:51:44
...
Optional 类是一个可以为 null 的容器对象,平常我们通过调用一个方法得到了返回值事需要判断返回值是否为 null,只有非空情况下才会将其传入给其它方法,Optional 能避免源码被各种 null 检查污染,开发出更简洁的代码
相关方法
of
- 为非 null 值创建一个 Optional,创建对象时参数不能为 null,否则会抛出 NullPointerException 异常
//调用工厂方法创建Optional实例
Optional<String> name = Optional.of("Sanaulla");
//传入参数为null,抛出NullPointerException.
Optional<String> someNull = Optional.of(null);
of Nullable
- 与 of 方法不同的是可以接受 null 值情况
//下面创建了一个不包含任何值的Optional实例
//例如,值为'null'
Optional empty = Optional.ofNullable(null);
isPresent
- 如果值存在返回 true,否则 false
//isPresent方法用来检查Optional实例中是否包含值
if(name.isPresent()) {
//在Optional实例内调用get()返回已存在的值
System.out.println(name.get());
//输出Sanaulla
}
get 方法
- 如果有值则返回,否则出 NoSuchElementException
//执行下面的代码会输出:No value present
try{
//在空的Optional实例上调用get(),抛出NoSuchElementException
System.out.println(empty.get());
}
catch(NoSuchElementException ex) {
System.out.println(ex.getMessage());
}
ifPresent
- 如果 Optional 实例有值则为其调用 consumer,否则不做处理,Comsumer 包含一个抽象方法,该方法传入对值进行处理,没有返回值
//ifPresent方法接受lambda表达式作为参数。
//lambda表达式对Optional的值调用consumer进行处理。
name.ifPresent((value) -> {
System.out.println(
"The length of the value is: "
+ value.length());
});
orElse
- 如果有值则返回,否则返回其它值
//如果值不为null,orElse方法返回Optional实例的值。
//如果为null,返回传入的消息。
//输出:There is no value present!
System.out.println(empty.orElse("There is no value present!"));
//输出:Sanaulla
System.out.println(name.orElse("There is some value!"));
orElseGet
- 与 orElse 类似,区别在于得到的默认值,orElse 传入字符串作为默认值,orElseGet 可以通过接收 Supplier 接口实现用来生成默认值
//orElseGet与orElse方法类似,区别在于orElse传入的是默认值,
//orElseGet可以接受一个lambda表达式生成默认值。
//输出:Default Value
System.out.println(empty.orElseGet(() ->"Default Value"));
//输出:Sanaulla
System.out.println(name.orElseGet(() ->"Default Value"));
orElseThrow
- 如果有值将其返回,否则抛出 supplier 接口创建的异常
try{
//orElseThrow与orElse方法类似。与返回默认值不同,
//orElseThrow会抛出lambda表达式或方法生成的异常
empty.orElseThrow(ValueAbsentException::new);
}
catch(Throwable ex) {
//输出: No value present in the Optional instance
System.out.println(ex.getMessage());
}
上一篇: Java8 Optional
下一篇: optional类的使用
推荐阅读
-
在centos7下安装和部署java8和mysql
-
Java8新特性Lambda表达式的一些复杂用法总结
-
函数式接口 + Lamda表达式推导过程(Java8 新特性)
-
AndroidStudio3 支持 Java8 了请问你敢用吗
-
微信小程序java8 java7 java6 encryptedData 解密 异常处理
-
java8 Lambda 表达式和函数式接口快速理解
-
Java8 新特性之流式数据处理
-
使用java8中的Optional API解决nullPointException问题
-
Arguments Optional 计算两个参数之和的 function
-
Java日期时间API系列11-----Jdk8中java.time包中的新的日期时间API类,使用java8日期时间API重写农历LunarDate