Optional 类是 JAVA 8 提供的判断程序是否为空提供的包装工具类;可以减少代码中的 是否为空的判断,以及减少 NullPointerExceptions;使得程序变得更为健壮;有助于创建简单、可读性更强、比对应程序错误更少的程序。
Optional 常用的方法总结:
empty : 创建一个空的Optional对象
of:为非null的值创建一个Optional。of方法通过工厂方法创建Optional类。需要注意的是,创建对象时传入的参数不能为null。如果传入参数为null,则抛出NullPointerException。因此不经常用。
ofNullable:为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。
isPresent: 检查一个Optional对象中是否有值,只有值非空才返回truex,否则返回false。
ifPresent:如果Optional实例有值则为其调用consumer,否则不做处理
get:如果Optional有值则将其返回,否则抛出NoSuchElementException。因此也不经常用。
orElse:如果有值则将其返回,否则返回指定的其它值。经常用于判断返回默认值的场景;
orElseGet:orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值
orElseThrow:如果有值则将其返回,否则抛出supplier接口创建的异常。
filter: 接收一个函数式接口 ,如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional。
map:如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。
flatMap:如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。
通过示例查看 optional 带来的好处
示例一:
根据用户的对象获取用户的名称,如果存在则返回用户名称,没有则返回 unknown ;没有使用 Option 的 Java 实现代码如下:
public static String getName2(User user){ if (user!=null){ String name = user.getName(); if (StringUtils.isBlank(name)){ return "unKnown"; } return name; } return "unKnown"; }
没有使用Optional 时,需要不断的判断是否为空,增加了代码的可读性和维护性,使用 Optional 之后,代码如下:
public static String getName(User user){ return Optional.ofNullable(user).map(p->p.getName()).orElse("unKnown"); }
使用Optional 之后,通过一行便完成了 上述的功能,减少了层层的 if 判断
示例 二:
从一批学生中,选出年龄大于等于18,参加过考试并且成绩大于80的人去参加比赛。
public void useJava8() { List<Student> studentList = initData(); for (Student student : studentList) { Optional<Student> studentOptional = Optional.of(student); Integer score = studentOptional.filter(s -> s.getAge() >= 18).map(Student::getScore).orElse(0); if (score > 80) { System.out.println("入选:" + student.getName()); } } }
标签: # Optional
留言评论