• Optional 常用方法总结


    转载请注明出处:

      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 studentList = initData();
        for (Student student : studentList) {
            Optional 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());
            }
        }
    }
    复制代码

     

  • 相关阅读:
    Tomcat 8.0下载与配置
    Apple 推出全球开发者资源 —— 人人能编程
    java -- 深拷贝和浅拷贝的区别 & 如何实现深拷贝和浅拷贝
    计算机专业学习的核心是什么?
    设计模式-代理模式
    Redis之持久化和事务
    无涯教程-JavaScript - INT函数
    YARN之Opportunistic Containers
    第一章 CIS 安全基准-网络访问控制
    spring高级篇(三)
  • 原文地址:https://www.cnblogs.com/zjdxr-up/p/16743483.html