使用`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不支持序列化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值