Java8 optional入门

Posted nogos

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8 optional入门相关的知识,希望对你有一定的参考价值。

Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

Optional 类的引入很好的解决空指针异常。

类声明

以下是一个 java.util.Optional 类的声明:

public final class Optional<T> extends Object

前言

工作中经常会有这样的一个经历:调用一个方法获得的返回值可能为空,需要进行null判断,然后再做一些相应的业务处理或者直接抛出NullPointerException。为了减少这样的null值判断,java官方借鉴google guava类库的Optional类,在java8 中引入了一个同样名字的Optional类,官方javadoc描述如下:

A container object which may or may not contain a non-null value. If a value is present, isPresent() will return true and get() will return the value.

本文会逐个介绍Optional类包含的方法,并通过几个示例展示如何使用:

of

为非Null值创建一个Optional

of方法通过工厂方法创建Optional实例,需要注意的是传入的参数不能为null,否则抛出NullPointerException。

// 给与一个非空值
Optional<String> username = Optional.of("cwl");
// 传入参数为null,抛出NullPointerException.
Optional<String> nullValue = Optional.of(null);

ofNullable

为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。可为空的Optional

// 下面创建了一个不包含任何值的Optional实例
// 输出Optional.empty
Optional empty = Optional.ofNullable(null);

isPresent

如果值存在返回true,否则返回false
类似下面的代码:

// isPresent方法用来检查Optional实例中是否包含值
if (username.isPresent()) 
    //在Optional实例内调用get()返回已存在的值
    System.out.println(username.get());      //输出cwl

get

如果Optional有值则将其返回,否则抛出NoSuchElementException。

// 执行下面的代码抛出NoSuchElementException
try 
     // 在空的Optional实例上调用get()
     System.out.println(empty.get());
  catch (NoSuchElementException ex) 
     System.out.println(ex.getMessage());         // 输出:No value present

最佳实践

如果您Optional用作仍可能返回的较旧API之间的“兼容性”层null,则在确定您拥有某些东西的最新阶段创建(非空)Optional可能会有所帮助。例如,您在何处写道:

Optional<Employee> employeeOptional = Optional.ofNullable(employeeService.getEmployee());
if(employeeOptional.isPresent())
    Employee employeeOptional= employeeOptional.get();
    System.out.println(employee.getId());

我会选择:

Optional.of(employeeService)                 // definitely have the service
        .map(EmployeeService::getEmployee)   // getEmployee() might return null
        .map(Employee::getId)                // get ID from employee if there is one
        .ifPresent(System.out::println);     // and if there is an ID, print it

关键是您知道这里有一个非空的员工服务,因此您可以将其包装在Optionalwith中Optional.of()。然后,当您提出要求getEmployee()时,您可能会或可能不会雇用一名雇员。该员工可能有(或可能没有)ID。然后,如果最后得到一个ID,则要打印它。

无需在此代码中显式检查任何 null,状态等。
https://qastack.cn/software/364211/why-use-optional-in-java-8-instead-of-traditional-null-pointer-checks
注:代码可读性并不令人满意

内容源自
https://www.runoob.com/java/java8-optional-class.html
https://juejin.im/entry/6844903600167059469

以上是关于Java8 optional入门的主要内容,如果未能解决你的问题,请参考以下文章

Java8中你可能不知道的一些地方之Optional实战

Java8中你可能不知道的一些地方之Stream实战

JAVA8--流处理和optional

《Java8实战》读书笔记09:用 Optional 处理值为 null 的情况

《Java8实战》读书笔记09:用 Optional 处理值为 null 的情况

Java8新特性--Optional