本文共 2571 字,大约阅读时间需要 8 分钟。
Optional
是Java 8中为了处理空指针异常而新增的类,同时这个类也提供了很多支持lambda
表达式的方法。下面我会通过几个例子向大家展示如何使用Optional
。
Optional
提供3个方法用于初始化Optional
对象:
Option.empty()
Optional.ofNullable()
Optional.of()
//构建一个空的OptionalOptionalempty=Optional.empty();String str="hello";//构建一个值不能为Null的Optional的对象Optional optionalStr=Optional.of(str);//构建一个空的Optional对象Optional optionalNull=Optional.ofNullable(null);//输出empty对象System.out.println(empty);//判断empty对象是否单例模式System.out.println(empty.equals(optionalNull));//输出带有值的Optional对象System.out.println(optionalStr);
Optional.emptytrueOptional[hello]
Optional.of()
不允许构建值为null的对象,入参为null
,如Optional.of(null)
时会直接抛出NullPointerException
。Optional.ofNullable(null)
等价于Option.empty()
,两者返回的是同一个对象Optional
提供了isPresent()
判断Optional
的值是否为null
,但是使用这个方法并未很好使用到Optional
处理空指针的优势。下面展示如何使用Optional
优雅地处理空指针。
//构建随机树对象Random random=new Random();//获取随机数Integer i=random.nextInt(100);//构建Optional对象,当随机数小于30,则构建empty对象OptionaloptionalInt=Optional.ofNullable(i>=30?i:null);//Optional对象的值不为null,则输出值optionalInt.ifPresent(integer -> { System.out.println(integer);});//当Optional对象的值为null时返回默认值0System.out.println(optionalInt.orElse(0));//当Optional对象的值为null时抛出一个RuntimeExceptionoptionalInt.orElseThrow(()->new RuntimeException());
由于这段代码执行结果存在随机性,所以不展示输出结果,有兴趣的朋友可以复制这段代码执行一下。
null
的Optional
对象调用get()
方法时会抛出NoSuchElementException
在Optional
中有2个类似的方法:orElse()
和orElseGet()
。两者的区别下面我会通过一个例子展示
public class User{ public User() { //通过输出内容判断构造方法是否被调用 System.out.println("User init"); }}
//构建一个值不为null的Optional对象Optionaluer=Optional.of(new User());System.out.println("use orElse");uer.orElse(new User());System.out.println("use orElseGet");uer.orElseGet(()->new User());
User inituse orElseUser inituse orElseGet
从输出结果可以看出当值不为null
的Optional
对象调用orElse()
方法时会调用构造方法,而调用orElseGet()
时则不会调用构造方法。
Optional
中也提供了filter()
、map()
和flatMap()
方法对Optional
的值进行过滤和类型转换操作
//构建随机树对象Random random=new Random();//构建Optional对象OptionaloptionalInt=Optional.of(random.nextInt(100));//过滤出大于0的值,System.out.println(optionalInt.filter(integer->integer>0));//将Integer转成DoubleSystem.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
。
转载地址:http://xroub.baihongyu.com/