zoukankan      html  css  js  c++  java
  • 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 项目中。

  • 相关阅读:
    hdu 5119 Happy Matt Friends
    hdu 5128 The E-pang Palace
    hdu 5131 Song Jiang's rank list
    hdu 5135 Little Zu Chongzhi's Triangles
    hdu 5137 How Many Maos Does the Guanxi Worth
    hdu 5122 K.Bro Sorting
    Human Gene Functions
    Palindrome(最长公共子序列)
    A Simple problem
    Alignment ( 最长上升(下降)子序列 )
  • 原文地址:https://www.cnblogs.com/huanghzm/p/12010572.html
Copyright © 2011-2022 走看看