Java关于JDK1.8中的Optional类

目录

  • Java关于JDK1.8中的Optional类
    • 一、定义
    • 二、Optional方法的使用
      • 1、empty 方法
      • 2、of 方法返
      • 3、返回一个Optional实例
      • 4、isPresent 方法
      • 5、get方法
      • 6、ifPresent
      • 7、filter方法
      • 8、 map(Function)
      • 9、flatMap()
      • 10、orElse方法
      • 11、orElseGet(Supplier supplier)
      • 12、orElseThrow方法
    • 三、实战参考

    Java关于JDK1.8中的Optional类
    一、定义
    Optional是一个容器,它可以保存类型T的值,或者仅仅保存null,Optional类主要是用来避免空指针异常(NPE),其提供的一系列的方法配合Lambda表达式可以让代码更加清晰,语义化,以及避免了空指针异常的问题,这里要注意是避免空指针异常,而不是避免返回null。

    二、Optional方法的使用

    1、empty 方法 empty 方法返回一个不包含值的Optional实例,注意不保证返回的empty是单例,不要用==比较。

    public static Optional empty()

    2、of 方法返 of 方法返回一个Optional实例,传入的值必须是非空值,传入null会抛出空指针异常。

    public static Optional of(T value)

    3、返回一个Optional实例 如果传入值非空,则实例中包含非空值,如果传入null,返回不包含值的empty

    public static Optional ofNullable(T value)

    4、isPresent 方法 用来判断实例是否包含值,如果不包含非空值返回false,否则返回true

    public boolean isPresent();

    5、get方法 如果实例包含值则返回当前值,否则抛出NoSushElementException 异常.

    public T get();
    不推荐调用上面两个方法,因为容易写出如下代码,比原先判断if null的代码还要脏
    public static String getUserName1(User user) {Optional user1 = Optional.ofNullable(user); if (!user1.isPresent()) {return "参数为空"; }return user1.get().getName(); }

    下面是用if-null
    public static String getUserName(User user) {if (user == null) {return "参数为空"; }return user.getName(); }


    6、ifPresent (Consumer consumer):如果option对象保存的值不是null,则调用consumer对象,否则不调用

    public void ifPresent(Consumer consumer);
    代码示例:
    Optional optional1 = Optional.ofNullable(1); Optional optional2 = Optional.ofNullable(null); //如果不是null,调用Consumeroptional1.ifPresent(t -> System.out.println("value is" + t)); //value is1//如果是null,不调用Consumeroptional2.ifPresent(t -> System.out.println("value is " + t));
    如上代码,输出结果是 第一条 语句输出value is1,第二条语句没有输出
    【Java关于JDK1.8中的Optional类】
    7、filter方法
    如果值存在,并且这个值匹配给定的predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional
    Optional filter(Predicate predicate)
    代码示例:
    Optional optional1 = Optional.ofNullable(1); Optional optional2 = Optional.ofNullable(null); Optional filter1 = optional1.filter(a -> a == null); Optional filter2 = optional1.filter((a) -> a == 1); Optional filter3 = optional2.filter(a -> a == null); System.out.println(filter1.isPresent()); //falseSystem.out.println(filter2.isPresent()); //trueSystem.out.println(filter2.get().intValue() == 1); //true
    如上代码,演示了filter方法如何使用,输出结果如代码注释所示。

    8、 map(Function) 对Optional中保存的值进行函数运算,并返回新的Optional(可以是任何类型)
    public Optional map(Function mapper);
    代码示例:输出结果已经写在注释中。
    Optional optional1 = Optional.ofNullable(1); Optional optional2 = Optional.ofNullable(null); Optional str1Optional = optional1.map(a -> "key" + a); Optional str2Optional = optional2.map(a -> "key" + a); System.out.println(str1Optional.get()); //key1System.out.println(str2Optional.isPresent()); //false

    9、flatMap() 功能与map()相似,差别在返回值不同,flatMap方法的mapping函数返回值可以是任何类型T,而map方法的mapping函数必须是Optional

    public Optional flatMap(Function> mapper);
    代码示例:
    Optional optional1 = Optional.ofNullable(1); Optional optional2 = Optional.ofNullable(null); Optional str11Optional = optional1.map(a -> Optional.of("key" + a)); Optional str22Optional = optional1.flatMap(a -> Optional.of("key" + a)); System.out.println(str11Optional.get().get()); //key1System.out.println(str22Optional.get()); //key1

    10、orElse方法 如果optional对象保存的值不是null,则返回原来的值,否则返回value。

    public T orElse(T other);
    代码示例:
    Optional optional1 = Optional.ofNullable(1); Optional optional2 = Optional.ofNullable(null); System.out.println(optional1.orElse(1000) == 1); //trueSystem.out.println((Integer) optional2.orElse(1000) == 1000); //true

    11、orElseGet(Supplier supplier) 功能与orElse一样,只不过orElseGet参数是一个对象。

    public T orElseGet(Supplier other);
    代码示例:
    Optional optional1 = Optional.ofNullable(1); Optional optional2 = Optional.ofNullable(null); System.out.println(optional1.orElseGet(() -> 1000) == 1); //trueSystem.out.println((Integer) optional2.orElseGet(() -> 1000) == 1000); //true

    12、orElseThrow方法 值不存在则调用传入的Supplier参数,生成一个异常实例并抛出,这个方法通常与全局异常处理器一起使用,当参数或者其他情况获取不到值是,抛出自定义异常,由异常处理器处理成通用返回结果。

    public T orElseThrow(Supplier exceptionSupplier);
    代码示例:
    optional1.orElseThrow(() -> {throw new IllegalStateException(); }); try {optional2.orElseThrow(() -> {throw new IllegalStateException(); }); } catch (IllegalStateException e) {e.printStackTrace(); }


    三、实战参考
    假设我们要解析一段json字符串,按照传统的if-null方式我们需要做如下处理:为了获取CUid的值,我们必须要判断三次。
    public static String getOrgUid(String orgResult) {if (StringUtils.isBlank(orgResult)) {return null; }JSONObject jsonObject = JSON.parseObject(orgResult); if (jsonObject == null) {return null; }if ("success".equals(jsonObject.getString("result"))) {return jsonObject.getString("CUid"); }return null; }

    而运用了我们的Optional类之后,我们可以通过函数式变成来实现。
    public static String getNewUid(String orgResult) {String orElse = Optional.ofNullable(orgResult).map(n -> JSONObject.parseObject(n)).map(a -> {if ("success".equals(a.getString("result"))) {return a.getString("CUid"); }return null; }).orElse(null); return orElse; }

    运用了函数式变成,我们只需要三段3段代码就能轻松的驾驭,代码简洁明了。

    到此这篇关于Java关于JDK1.8中的Optional类的文章就介绍到这了,更多相关Java的Optional类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

      推荐阅读