博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java8的Optional
阅读量:2197 次
发布时间:2019-05-02

本文共 2571 字,大约阅读时间需要 8 分钟。

简介

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

实战

初始化

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

  1. Option.empty()
  2. Optional.ofNullable()
  3. Optional.of()

示例

//构建一个空的OptionalOptional
empty=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]

注意事项

  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
optionalInt=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());

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

注意事项

  1. 值为nullOptional对象调用get()方法时会抛出NoSuchElementException

orElse和orElseGet的区别

Optional中有2个类似的方法:orElse()orElseGet()。两者的区别下面我会通过一个例子展示

示例

public class User{    public User() {        //通过输出内容判断构造方法是否被调用        System.out.println("User init");    }}
//构建一个值不为null的Optional对象Optional
uer=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

分析

从输出结果可以看出当值不为nullOptional对象调用orElse()方法时会调用构造方法,而调用orElseGet()时则不会调用构造方法。

过滤和类型转换

Optional中也提供了filter()map()flatMap()方法对Optional的值进行过滤和类型转换操作

示例

//构建随机树对象Random random=new Random();//构建Optional对象Optional
optionalInt=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))));

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

注意事项

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

拓展

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

转载地址:http://xroub.baihongyu.com/

你可能感兴趣的文章
iOS MapKit导航及地理转码辅助类
查看>>
检测iOS的网络可用性并打开网络设置
查看>>
简单封装FMDB操作sqlite的模板
查看>>
iOS开发中Instruments的用法
查看>>
iOS常用宏定义
查看>>
强引用 软引用 弱引用 虚引用
查看>>
数据类型 java转换
查看>>
"NetworkError: 400 Bad Request - http://172.16.47.117:8088/rhip/**/####t/approval?date=976
查看>>
mybatis 根据 数据库表 自动生成 实体
查看>>
win10将IE11兼容ie10
查看>>
checkbox设置字体颜色
查看>>
第一篇 HelloWorld.java重新学起
查看>>
ORACLE表空间扩张
查看>>
orcal 循环执行sql
查看>>
web.xml配置监听器,加载数据库信息配置文件ServletContextListener
查看>>
结构型模式之桥接模式(Bridge)
查看>>
行为型模式之状态模式(State)
查看>>
行为型模式之策略模式(Strategy)
查看>>
行为型模式之模板方法模式(TemplateMethod)
查看>>
行为型模式之访问者模式(Visitor)
查看>>