在Java业务开发中,我们经常会遇到需要判断对象是否为空再执行对应逻辑的场景,传统写法往往会产生大量嵌套的if判断或者三元表达式,不仅代码冗余,还容易遗漏空值处理导致空指针异常。Java 8提供的Optional类中的or方法和ifPresentOrElse方法,能够帮助我们更优雅地处理这类问题,从根源上减少空判断分支。

传统空判断方式的问题
先来看一段常见的业务代码,逻辑是获取用户信息,如果用户不存在则使用默认用户,同时如果用户存在则打印用户信息,不存在则打印提示:
// 传统写法
User user = getUserById(1);
User resultUser;
if (user != null) {
resultUser = user;
System.out.println("用户存在:" + user.getName());
} else {
resultUser = getDefaultUser();
System.out.println("用户不存在,使用默认用户");
}
这种写法存在明显的不足,当判断层级变多时,嵌套的if会让代码可读性急剧下降,而且每次调用对象方法前都需要先判断非空,很容易出现遗漏。
Optional核心方法介绍
or方法的作用
or方法用于在Optional对象为空时,提供一个备选的Optional对象,它的入参是一个Supplier函数式接口,返回一个新的Optional实例。如果当前Optional有值,就返回当前Optional,否则返回Supplier生成的Optional。
ifPresentOrElse方法的作用
ifPresentOrElse方法用于根据Optional是否有值执行不同的逻辑,它接收两个参数:第一个是Consumer,当Optional有值时执行;第二个是Runnable,当Optional为空时执行。这样就不需要先判断再分别处理,把两种场景的逻辑整合到一个方法中。
用or和ifPresentOrElse改写业务逻辑
我们用这两个方法改写前面的示例,首先改造获取用户并处理空值的逻辑:
import java.util.Optional;
public class OptionalDemo {
// 模拟获取用户的方法,可能返回null
public static User getUserById(Integer id) {
// 实际业务中可能是数据库查询等逻辑
return id == 1 ? new User("张三", 20) : null;
}
// 模拟获取默认用户
public static User getDefaultUser() {
return new User("默认用户", 0);
}
public static void main(String[] args) {
// 使用Optional包装返回值
Optional<User> userOptional = Optional.ofNullable(getUserById(1));
// 使用or方法处理空值,获取最终的用户Optional
Optional<User> finalUserOptional = userOptional.or(() -> Optional.ofNullable(getDefaultUser()));
// 使用ifPresentOrElse处理两种场景的逻辑
finalUserOptional.ifPresentOrElse(
user -> System.out.println("用户存在:" + user.getName()),
() -> System.out.println("用户不存在,使用默认用户")
);
}
// 用户实体类
static class User {
private String name;
private Integer age;
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
}
}
可以看到,改写后的代码没有显式的null判断分支,所有逻辑都通过Optional的方法链式调用完成,代码更简洁,也避免了空指针的风险。
更复杂的业务场景示例
再来看一个多层级空判断的场景,比如获取用户的订单中的商品名称,传统写法需要逐层判断:
// 传统多层级空判断
String productName = null;
User user = getUserById(1);
if (user != null) {
Order order = user.getOrder();
if (order != null) {
Product product = order.getProduct();
if (product != null) {
productName = product.getName();
} else {
productName = "默认商品";
}
} else {
productName = "默认商品";
}
} else {
productName = "默认商品";
}
用Optional改写后:
import java.util.Optional;
public class OptionalDemo2 {
public static void main(String[] args) {
Optional<User> userOptional = Optional.ofNullable(getUserById(1));
String productName = userOptional
.map(User::getOrder)
.map(Order::getProduct)
.map(Product::getName)
.or(() -> Optional.of("默认商品"))
.get();
System.out.println("商品名称:" + productName);
}
// 模拟方法省略,和前面示例类似
static class User {
private Order order;
public Order getOrder() { return order; }
}
static class Order {
private Product product;
public Product getProduct() { return product; }
}
static class Product {
private String name;
public String getName() { return name; }
}
}
这里结合map方法和or方法,完全消除了嵌套的空判断分支,代码逻辑一目了然。
使用注意事项
- 不要为了用Optional而强行使用,简单的非空判断如果逻辑简单,传统写法也可以接受,Optional更适合复杂的链式空值处理场景。
- or方法的入参是Supplier<Optional<T>>,需要返回Optional类型,不要直接返回普通对象,否则会报错。
- ifPresentOrElse的两个参数都是函数式接口,不要在其中写过于复杂的逻辑,否则会影响代码可读性。
- 避免频繁调用Optional的get方法,除非你确定Optional一定有值,否则还是优先用or、ifPresentOrElse等方法处理空值。
通过合理使用Optional的or和ifPresentOrElse方法,我们可以大幅减少业务代码中的空判断分支,让代码更简洁、更健壮,从编码层面降低空指针异常的发生概率。
OptionalorifPresentOrElse空指针判断Java_8修改时间:2026-07-23 00:21:29