Java基础之【java8的Optinal】

博客介绍了Optional的最佳实践,其主要作用是解决因null值带来的过多判断问题,在信息技术领域,可有效优化代码逻辑,避免因null检查导致的代码冗余。

Optional的最佳实践(解决null带来的过多判断) 

private String getUserName(User user) {
    if (user != null) {
        return user.getUserName();
    }
    return null;
}
这是十分繁琐的一段代码。而如果使用Optional则会要精简很多:
private String getUserName(User user) {
    Optional<User> userOptional = Optional.ofNullable(user);
    return userOptional.map(User::getUserName).orElse(null);
}

 

Java 中,如果你要安全地获取一个对象的属性(例如 `user.getName()`),但不确定这个对象是否为 `null`,可以使用 `Optional` 类来优雅地处理空值问题。 --- ### ✅ 使用 `Optional` 获取对象属性的推荐方式 #### 示例代码: ```java import java.util.Optional; public class User { private String name; public User(String name) { this.name = name; } public String getName() { return name; } } ``` 假设我们有一个可能为 `null` 的 `User` 对象,要安全地获取其 `name` 属性: ```java public class Main { public static void main(String[] args) { User user = getUser(); // 可能返回 null // 使用 Optional 安全获取 name String name = Optional.ofNullable(user) .map(u -> u.getName()) .orElse("默认名称"); System.out.println("用户名: " + name); } // 模拟一个可能返回 null 的方法 public static User getUser() { return Math.random() > 0.5 ? new User("Alice") : null; } } ``` --- ### 🔍 代码解释 - `Optional.ofNullable(user)`:创建一个可能为空的 `Optional` 实例。 - `.map(u -> u.getName())`:如果 `user` 不为 `null`,就调用 `getName()`。 - `.orElse("默认名称")`:如果 `user` 为 `null` 或者 `name` 为 `null`,则返回默认值。 你也可以使用 `.orElseGet()` 或 `.ifPresent()` 来进行更复杂的处理: #### 示例 2:使用 `ifPresent` ```java Optional.ofNullable(user) .map(User::getName) .ifPresent(name -> System.out.println("用户名是: " + name)); ``` #### 示例 3:多层嵌套属性获取(比如 user.getAddress().getCity()) ```java String city = Optional.ofNullable(user) .flatMap(u -> Optional.ofNullable(u.getAddress())) .map(Address::getCity) .orElse("未知城市"); ``` > 假设 `User` 类中还有一个 `getAddress()` 方法返回 `Address` 对象。 --- ### ⚠️ 注意事项 - `Optional` 并不是为所有 `null` 检查设计的,它更适合用于返回值,尤其是 API 的返回。 - 不建议在集合中使用 `Optional`,比如 `List<Optional<String>>`,这是反模式。 - `Optional.get()` 一定要在确保有值时调用,否则可能抛出异常。 --- ### ✅ 小技巧:使用 Lombok 的 `@Accessors(chain = true)` + `Optional` 如果你使用 Lombok 并希望链式调用,可以这样写: ```java User user = Optional.ofNullable(findUser()) .map(u -> u.setName("Bob")) .orElse(null); ``` --- ### 总结 使用 `Optional` 获取对象属性时,关键点在于: - 使用 `ofNullable()` 包裹可能为 `null` 的对象; - 使用 `map()` 或 `flatMap()` 获取属性; - 最后使用 `orElse()` 或 `ifPresent()` 处理结果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值