版权声明:本文为博主原创文章,转载时需要带上原文链接。 https://blog.csdn.net/a158123/article/details/85058295
简介
Optional
是Java 8中为了处理空指针异常而新增的类,同时这个类也提供了很多支持lambda
表达式的方法。下面我会通过几个例子向大家展示如何使用Optional
。
实战
初始化
Optional
提供3个方法用于初始化Optional
对象:
Option.empty()
Optional.ofNullable()
Optional.of()
示例
//构建一个空的Optional
Optional<String> empty=Optional.empty();
String str="hello";
//构建一个值不能为Null的Optional的对象
Optional<String> optionalStr=Optional.of(str);
//构建一个空的Optional对象
Optional<String> optionalNull=Optional.ofNullable(null);
//输出empty对象
System.out.println(empty);
//判断empty对象是否单例模式
System.out.println(empty.equals(optionalNull));
//输出带有值的Optional对象
System.out.println(optionalStr);
输出结果
Optional.empty
true
Optional[hello]
注意事项
Optional.of()
不允许构建值为null的对象,入参为null
,如Optional.of(null)
时会直接抛出NullPointerException
。Optional.ofNullable(null)
等价于Option.empty()
,两者返回的是同一个对象
Optional如何处理空指针
Optional
提供了isPresent()
判断Optional
的值是否为null
,但是使用这个方法并未很好使用到Optional
处理空指针的优势。下面展示如何使用Optional
优雅地处理空指针。
示例
//构建随机树对象
Random random=new Random();
//获取随机数
Integer i=random.nextInt(100);
//构建Optional对象,当随机数小于30,则构建empty对象
Optional<Integer> optionalInt=Optional.ofNullable(i>=30?i:null);
//Optional对象的值不为null,则输出值
optionalInt.ifPresent(integer -> {
System.out.println(integer);
});
//当Optional对象的值为null时返回默认值0
System.out.println(optionalInt.orElse(0));
//当Optional对象的值为null时抛出一个RuntimeException
optionalInt.orElseThrow(()->new RuntimeException());
由于这段代码执行结果存在随机性,所以不展示输出结果,有兴趣的朋友可以复制这段代码执行一下。
注意事项
- 值为
null
的Optional
对象调用get()
方法时会抛出NoSuchElementException
orElse和orElseGet的区别
在Optional
中有2个类似的方法:orElse()
和orElseGet()
。两者的区别下面我会通过一个例子展示
示例
public class User{
public User() {
//通过输出内容判断构造方法是否被调用
System.out.println("User init");
}
}
//构建一个值不为null的Optional对象
Optional<User> uer=Optional.of(new User());
System.out.println("use orElse");
uer.orElse(new User());
System.out.println("use orElseGet");
uer.orElseGet(()->new User());
输出结果
User init
use orElse
User init
use orElseGet
分析
从输出结果可以看出当值不为null
的Optional
对象调用orElse()
方法时会调用构造方法,而调用orElseGet()
时则不会调用构造方法。
过滤和类型转换
Optional
中也提供了filter()
、map()
和flatMap()
方法对Optional
的值进行过滤和类型转换操作
示例
//构建随机树对象
Random random=new Random();
//构建Optional对象
Optional<Integer> optionalInt=Optional.of(random.nextInt(100));
//过滤出大于0的值,
System.out.println(optionalInt.filter(integer->integer>0));
//将Integer转成Double
System.out.println(optionalInt.map(integer -> Double.valueOf(integer)));
//将值为Integer的Optional对象转成值为Double的Optional对象
System.out.println(optionalInt.flatMap(integer -> Optional.ofNullable(Double.valueOf(integer))));
由于这段代码执行结果存在随机性,所以不展示输出结果,有兴趣的朋友可以复制这段代码执行一下。
注意事项
filter()
方法如果值不满足过滤条件时,返回值为Optional.empty()
对象
拓展
Optional
提供了3个和数值有关的功能拓展类OptionalDouble
、OptionalInt
和OptionalLong
。