Java Optional类

引言

  本文主要介绍 Java 8 的新特性中 Optional 类的介绍。

  从 Java 8 引入的一个很有趣的特性是 Optional  类。Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非常了解的异常。

  本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。

  Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。但是 Optional 的意义显然不止于此。

测试用例

of 方法

  该方法通过一个非 null 的 value 来构造一个 Optional,返回的 Optional 包含了 value 这个值。对于该方法,传入的参数一定不能为 null,否则便会抛出 NullPointerException

        Optional<String> of_out = Optional.of("name");
        System.out.println(of_out.get());

ofNullable 方法

  该方法和 of 方法的区别在于,传入的参数可以为 null

        Optional<String> ofNullable_out = Optional.ofNullable(null);
        System.out.println(ofNullable_out);

empty 方法

  该方法用来构造一个空的 Optional,即该 Optional 中不包含值

        System.out.println(Optional.empty());

ifPresent 方法

  判断是否为null 如果不为空,则进行()操作;反之,则什么都不做

        Optional.ofNullable(null).ifPresent(name -> {
            System.out.println("new string");
        });

orElse 方法

  如果 Optional 中有值则将其返回,否则返回 orElse 方法传入的参数

        Optional<String> orElse_out = Optional.ofNullable(null);
        System.out.println(orElse_out.orElse("other string"));

orElseGet 方法

  orElseGet与orElse方法类似,区别在于得到的默认值 orElseGet方法可以接受Supplier接口的实现用来生成默认值

        UserInfo user = (UserInfo) Optional.ofNullable(null).orElseGet(() -> new UserInfo("other", "other name"));
        System.out.println(user.getUserName());

isPresent 方法

  判断值是否为null, 如果值存在返回true,否则返回false

        Optional<String> name = Optional.of("name");
        if (name.isPresent()) {
            System.out.println(name.get());
        }

orElseThrow 方法

  如果有值则将其返回,否则抛出supplier接口创建的异常

        try {
            String text = Optional.ofNullable("this is text").orElseThrow(() -> new Exception("出现错误啦"));
            System.out.println(text);
        }
        catch (Exception ex) {
            System.out.println(ex.getMessage());
        }

map 方法

  如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional

        Optional<String> username = Optional.ofNullable(new UserInfo("userId", "userName")).map(u -> u.getUserName()).map(y-> y.toUpperCase());
        System.out.println("Username is: " + username.orElse("Unknown"));

flatMap 方法

  flatMap 要求参数中的函数 mapper 输出的就是 Optional

        Optional<String> u_name = Optional.ofNullable(new UserInfo("userId", "userName")).flatMap(u -> Optional.of(u.getUserName()));
        System.out.println("Username is: " + u_name.orElse("Unknown"));

filter 方法

        Optional<UserInfo> filter_user = Optional.ofNullable(new UserInfo("userId", "userName"))
                .filter(u -> u.getUserId().equals("userId"));
        System.out.println("user is: " + filter_user.orElse(null).toString());

Optional  应该怎样用

  在使用 Optional 的时候需要考虑一些事情,以决定什么时候怎样使用它。

  重要的一点是 Optional 不是 Serializable。因此,它不应该用作类的字段。

  如果你需要序列化的对象包含 Optional 值,Jackson 库支持把 Optional 当作普通对象。也就是说,Jackson 会把空对象看作 null,而有值的对象则把其值看作对应域的值。这个功能在 jackson-modules-java8 项目中。

posted @ 2019-12-09 13:55  JaminHuang  阅读(295)  评论(0编辑  收藏  举报