• 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 项目中。

  • 相关阅读:
    [CF724G]Xor-matic Number of the Graph
    [SOJ #537]不包含 [CF102129I]Incomparable Pairs(2019-8-6考试)
    [SOJ #538]好数 [CC]FAVNUM(2019-8-6考试)
    [洛谷P4052][JSOI2007]文本生成器
    [洛谷P3966][TJOI2013]单词
    [洛谷P5158]【模板】多项式快速插值
    [洛谷P3227][HNOI2013]切糕
    【bzoj】3477: [Usaco2014 Mar]Sabotage 01分数规划
    【SPOJ
    【以前的空间】系列
  • 原文地址:https://www.cnblogs.com/huanghzm/p/12010572.html
Copyright © 2020-2023  润新知