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实战》读书笔记09:用 Optional 处理值为 null 的情况