Optional

Optional判空处理

1、初始申明

Optional<String> str = Optional.empty(); //初始化一个空
Optional<String> str1 = Optional.of("hello word");//初始值不能为空
Optional<String> str2 = Optional.ofNullable("hello word");//初始值可以为空

2、使用

System.out.println("value="+ str.orElse("nihao1"));   //空时返回nihao1
System.out.println("value="+ str.orElseGet(()->{return "nihao2";})); //空时调用指定实现接口返回
System.out.println("value="+ str1.orElseThrow(()->{ return new RuntimeException("str"); }));//空时响应指定异常
//不为空时执行指定操作
str1.ifPresent(v->{
    System.out.println("value="+ v);
});

转载于:https://my.oschina.net/u/3783256/blog/3063406

### Optional 的使用方法 `Optional` 是 Java 8 引入的一个容器类,用于处理可能为 `null` 的值,从而避免空指针异常(NullPointerException, NPE)。它提供了一系列方法来优雅地处理空值问题。 #### 创建 Optional 实例 - **`empty()`**:创建一个空的 `Optional` 实例,适用于值确实为空的情况。 - **`of(T value)`**:创建一个包含非空值的 `Optional` 实例。如果传入的值为 `null`,会抛出 `NullPointerException`。 - **`ofNullable(T value)`**:创建一个 `Optional` 实例,如果值为 `null`,则返回一个空的 `Optional`,而不是抛出异常 [^2]。 #### 获取值 - **`get()`**:返回 `Optional` 中包装的值。在调用前必须确保值存在,否则会抛出异常。 - **`isPresent()`**:判断 `Optional` 中是否有值,返回布尔值。 - **`ifPresent(Consumer<? super T> consumer)`**:如果值存在,则执行给定的消费者操作,否则不执行任何操作 [^1]。 #### 提供默认值或抛出异常 - **`orElse(T other)`**:返回 `Optional` 中包装的值,如果值不存在,则返回指定的默认值。 - **`orElseGet(Supplier<? extends T> other)`**:与 `orElse` 类似,但默认值是通过 `Supplier` 函数式接口提供的,只有在值不存在时才会计算。 - **`orElseThrow(Supplier<? extends X> exceptionSupplier)`**:返回 `Optional` 中的值,如果不存在,则抛出指定的异常 [^1]。 ### Optional 的最佳实践 #### 避免直接使用 `get()` 在没有确认 `Optional` 是否包含值的情况下,直接调用 `get()` 方法是非常危险的,因为它可能会抛出 `NoSuchElementException`。因此,在调用 `get()` 之前,应始终使用 `isPresent()` 或 `ifPresent()` 来检查值是否存在 。 #### 使用 `orElse` 和 `orElseGet` 提供默认值 当需要处理可能为空的情况时,`orElse` 和 `orElseGet` 是非常有用的工具。`orElseGet` 特别适合在默认值需要复杂计算时使用,因为它只在必要时才执行计算 [^1]。 #### 使用 `map` 和 `flatMap` 进行链式调用 `Optional` 支持 `map` 和 `flatMap` 方法,允许对值进行转换而不必显式地进行空值检查。例如,在处理嵌套对象时,可以使用 `flatMap` 来简化代码 [^3]。 #### 示例代码 ```java public Result<TaskInfoVo> getTaskInfo(String taskId) { TaskNode taskNode = taskExecutor.getByTaskId(taskId); TaskInfoVo taskInfoVo = TaskInfoVo.builder() .taskName(taskNode.getName()) .finishTime(Optional.ofNullable(taskNode.getFinishTime()) .map(date -> date.getTime()) .orElse(null)) .user(taskNode.getUser()) .memo(taskNode.getMemo()) .build(); return Result.ok(taskInfoVo); } ``` 在这个例子中,`Optional.ofNullable` 被用来处理 `taskNode.getFinishTime()` 可能为 `null` 的情况。通过 `map` 方法,可以安全地将日期转换为时间戳,而无需担心空指针异常 [^3]。 #### 减少 `if (obj == null)` 检查 通过合理使用 `Optional`,可以减少代码中大量的 `if (obj == null)` 检查,使代码更加简洁和易读。特别是在与外部世界(如数据库查询、REST 端点等)交互时,`Optional` 可以帮助更好地管理空值 [^4]。 #### 避免过度使用 `Optional` 尽管 `Optional` 提供了许多便利,但过度使用它也可能导致代码变得难以理解和维护。因此,在决定是否使用 `Optional` 时,应权衡其利弊,并确保团队成员都理解其用途和用法 [^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值