美文网首页
Java8 教程第十五章之Optional 用法

Java8 教程第十五章之Optional 用法

作者: PrimaryKeyEnoch | 来源:发表于2019-08-13 22:44 被阅读0次

本套JAVA8教程由于是有英文翻译过来的,如果有翻译不对的地方还请多多包涵。

本节课先简单的介绍下Java8有哪些新特性,对于Java6/7版本做出哪些更改.那废话不多说,赶紧开始今天的课程吧.

引子

Java 8在java.util包中引入了一个新类Optional。 它用于表示存在或不存在的值。 这个新构造的主要优点是没有太多的空检查和NullPointerException。 它避免了任何运行时NullPointerExceptions,并支持我们开发干净整洁的Java API或应用程序。 与集合和数组一样,它也是一个容纳最多一个值的容器。 让我们用一些有用的例子来探索这个新的构造。

那么在java8 中:

  • 需要空检查
  • 在运行时不再有NullPointerException
  • 我们可以开发干净整洁的API

Optional 基础例子

public static void main(String[] args) {

        Optional<String> gender = Optional.of("MALE");
        String answer1 = "Yes";
        String answer2 = null;

        System.out.println("Non-Empty Optional:" + gender);
        System.out.println("Non-Empty Optional: Gender value : " + gender.get());
        System.out.println("Empty Optional: " + Optional.empty());

        System.out.println("ofNullable on Non-Empty Optional: " + Optional.ofNullable(answer1));
        System.out.println("ofNullable on Empty Optional: " + Optional.ofNullable(answer2));

        // java.lang.NullPointerException
        System.out.println("ofNullable on Non-Empty Optional: " + Optional.of(answer2));

    }

输出内容

Non-Empty Optional:Optional[MALE]
Non-Empty Optional: Gender value : MALE
Empty Optional: Optional.empty
ofNullable on Non-Empty Optional: Optional[Yes]
ofNullable on Empty Optional: Optional.empty
Exception in thread "main" java.lang.NullPointerException
    at java.util.Objects.requireNonNull(Objects.java:203)
    at java.util.Optional.<init>(Optional.java:96)
    at java.util.Optional.of(Optional.java:108)
    at Java82.main(Java82.java:30)

Optional的map和flatMap用法

public static void main(String[] args) {
        Optional<String> nonEmptyGender = Optional.of("male");
        Optional<String> emptyGender = Optional.empty();
        System.out.println("不为空 Optional:: " + nonEmptyGender.map(String::toUpperCase));
        System.out.println("空 Optional    :: " + emptyGender.map(String::toUpperCase));

        Optional<Optional<String>> nonEmptyOtionalGender = Optional.of(Optional.of("male"));
        System.out.println("Optional value   :: " + nonEmptyOtionalGender);
        System.out.println("Optional.map     :: " + nonEmptyOtionalGender.map(gender -> gender.map(String::toUpperCase)));
        System.out.println("Optional.flatMap :: " + nonEmptyOtionalGender.flatMap(gender -> gender.map(String::toUpperCase)));
    }

输出

不为空 Optional:: Optional[MALE]
空 Optional    :: Optional.empty
Optional value   :: Optional[Optional[male]]
Optional.map     :: Optional[Optional[MALE]]
Optional.flatMap :: Optional[MALE]

Optional filter用法

 public static void main(String[] args) {
        Optional<String> gender = Optional.of("MALE");
        Optional<String> emptyGender = Optional.empty();
        //Filter on Optional
        System.out.println(gender.filter(g -> g.equals("male"))); //Optional.empty
        System.out.println(gender.filter(g -> g.equalsIgnoreCase("MALE"))); //Optional[MALE]
        System.out.println(emptyGender.filter(g -> g.equalsIgnoreCase("MALE"))); //Optional.empty
    }

输出

Optional.empty
Optional[MALE]
Optional.empty

Optional 中 isPresent 和 ifPresent的用法

如果给定的Optional对象非空,则Optional.isPresent()返回true。否则返回false

public static void main(String[] args) {

        Optional<String> gender = Optional.of("MALE");
        Optional<String> emptyGender = Optional.empty();
        if (gender.isPresent()) {
            System.out.println("Value available.");
        } else {
            System.out.println("Value not available.");
        }
        gender.ifPresent(g -> System.out.println("不会报空指针"));
        //condition failed, no output print
        emptyGender.ifPresent(g -> System.out.println("不会报空指针"));
    }

输出

Value available.
不会报空指针
空

Optional orElse 方法

解释:如果在Optional Container中存在,则返回该值。否则返回给定的默认值。

   public static void main(String[] args) {

        Optional<String> gender = Optional.of("梁思前");
        Optional<String> emptyGender = Optional.empty();

        System.out.println(gender.orElse("<N/A>")); //梁思前
        System.out.println(emptyGender.orElse("<N/A>")); //<N/A>

        System.out.println(gender.orElseGet(() -> "<N/A>")); //梁思前
        System.out.println(emptyGender.orElseGet(() -> "<N/A>")); //<N/A>

    }

输出

梁思前
<N/A>
梁思前
<N/A>

其实看到这里大家应该看懂了吧, 其实就是一个if else的逻辑, 这样看起来更清爽,而且会提示你让你强制判断空指针的问题,从而告别空指针.

欢迎留言讨论

相关文章

  • Java8 教程第十五章之Optional 用法

    本套JAVA8教程由于是有英文翻译过来的,如果有翻译不对的地方还请多多包涵。 本节课先简单的介绍下Java8有哪些...

  • JAVA8- Optional-用法浅析

    JAVA8- Optional-用法浅析 简介 java8新引入optional特性,官方说法是更优雅的处理空指针...

  • Optional

    Java8中Optional为util包中一个类 创建Optional对象 Optional.of() 传入对象不...

  • JAVA8新特性-Optional类解决NPE问题

    ** JAVA8新特性-Optional类解决NPE问题** API介绍 1、Optional(T value),...

  • Java-8-Optional类

    Java-8-Optional类 java8新特性之Optional类 空指针异常是一个运行时异常,对于这一类异常...

  • Optional源码分析(未完)

    Optional源码分析(未完) Optional 类是Java8的新特性,Optional是一个可以为null的...

  • java8新特性Optional用法

    Java8引入Optional库来解决NullPointerException ,从而避免源码被各种null检查污...

  • Optional类

    Optional类为Java8新引入的一个类,Optional是一个可以为null的容器对象,Optional中的...

  • java8 - optional

    optional 是java8的新特性,The purpose of the class is to provid...

  • 【java8新特性 简述】Optional

    Optional类是Java8为了解决null值判断问题,借鉴google guava类库的Optional类而引...

网友评论

      本文标题:Java8 教程第十五章之Optional 用法

      本文链接:https://www.haomeiwen.com/subject/msdijctx.html