使用`Optional`

使用Optional

支持没有结果的方法

简单的来说,Optional是一个包装类,Optional<T>是引用包装类,还有OptionalInt, OptionalLong, OptionalDouble值包装类。不同于经典的包装类Integer, Long, Double等,Optional可以为空(此空非彼空null,更类似于void,意思没有任何值)。

如果你需要一种机制返回空(没有值),并且返回null会导致NullPointerException异常,这样的话你可以考虑使用Optional

创建Optional对象

有三个工厂方法(OptionalInt, OptionalLong, OptionalDouble只有2个工厂方法)

  1. 创建一个空的Optional.empty()

  2. 包装一个非null值对象Optional.of(),如果为null会抛出NullPointerException

  3. 包装任何对象包括null``Optional.ofNullable(),如果你包装了null,就类似于Optional.empty()

打开Optional对象

有几种方法访问包装的元素。你可以直接访问或者通过类似stream流的方式map(), flatMap(), filter(), forEach()

除非你明确知道Optional中有值,否则你应该避免直接打开它,因为直接打开空Optional会抛出NoSuchElementException异常。

你应该先测试是否存在值。有2种方法可以使用isPresent()和jdk11新增的isEmpty()

然后再打开Optional,使用如下方法

  • get()已经废弃,方法名类似getter但会抛出NoSuchElementException异常

  • orElseThrow() jdk10推荐模式,与get()一样

  • orElseThrow(Supplier exceptionSupplier)指定抛出自定义异常

你也可以给定个默认值,当Optional为空时返回给定的值

  • orElse(T returnedObject)

  • orElseGet(Supplier<T> supplier)

最后你也可以当Optional为空时创建另一个Optional

  • or(Supplier<Optional> supplier)Optional不为空时返回,如果Optional为空时则创建另一个Optional并返回

处理Optional对象

Optional类提供了类似Stream API的方法更容易与Stream API集成

example

String findCustomerNameById(int id){
    List<Customer> customers = ...;

    return customers.stream()
                    .filter(customer->customer.getId() == id);
                    .findFirst()
                    .map(Customer::getName)
                    .orElse("UNKNOWN");
}

消费Optional上下文

  • ifPresent(Consumer consumer)

  • ifPresentOrElse(Consumer consumer, Runnable runnable)

正确使用Optional的一些规则

  1. 切勿将 null 用于Optional变量或返回值。

  2. 除非您确定Optional不为空,否则切勿调用 orElseThrow()get()

  3. 选用get()的替代方法,isPresent(), orElseThrow()

  4. 测试时不要创建Optional

  5. 不要在字段、方法参、集合和映射种使用Optional,最好只用于返回值

  6. 不要使用Optional对象的身份操作,例如equals(), hashCode(), wait()Object对象方法

  7. 请记住Optional不支持序列化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值