Java8的Optional

版权声明:本文为博主原创文章,转载时需要带上原文链接。 https://blog.csdn.net/a158123/article/details/85058295

简介

Optional是Java 8中为了处理空指针异常而新增的类,同时这个类也提供了很多支持lambda表达式的方法。下面我会通过几个例子向大家展示如何使用Optional

实战

初始化

Optional提供3个方法用于初始化Optional对象:

  1. Option.empty()
  2. Optional.ofNullable()
  3. 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]

注意事项

  1. Optional.of()不允许构建值为null的对象,入参为null,如Optional.of(null)时会直接抛出NullPointerException
  2. 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());

由于这段代码执行结果存在随机性,所以不展示输出结果,有兴趣的朋友可以复制这段代码执行一下。

注意事项

  1. 值为nullOptional对象调用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

分析

从输出结果可以看出当值不为nullOptional对象调用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))));

由于这段代码执行结果存在随机性,所以不展示输出结果,有兴趣的朋友可以复制这段代码执行一下。

注意事项

  1. filter()方法如果值不满足过滤条件时,返回值为Optional.empty()对象

拓展

Optional提供了3个和数值有关的功能拓展类OptionalDoubleOptionalIntOptionalLong

猜你喜欢

转载自blog.csdn.net/a158123/article/details/85058295