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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值