• 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());
            }
        }
    }
    复制代码

     

  • 相关阅读:
    Vue中使组件置顶后悬浮
    spark获取hadoop服务token
    互融云工业品电商系统开发整体解决方案 助力行业数字信息化发展
    springboot毕设项目宠物医院管理系统yneox(java+VUE+Mybatis+Maven+Mysql)
    【第五篇】-Maven 构建配置文件
    Node.js -- fs模块
    springboot+nodejs+vue+Elementui网上商城购物系统
    2.3 如何使用FlinkSQL读取&写入到JDBC(MySQL)
    mybatis-plus中多租户字段自动处理(MyBatisPlus报错:Column ‘xxx‘ specified twice)
    图像相似度对比分析软件,图像相似度计算方法
  • 原文地址:https://www.cnblogs.com/zjdxr-up/p/16743483.html