导读:本期聚焦于小伙伴创作的《怎么利用 Optional 的 or 与 ifPresentOrElse 彻底消除业务逻辑中的空指针判断分支》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《怎么利用 Optional 的 or 与 ifPresentOrElse 彻底消除业务逻辑中的空指针判断分支》有用,将其分享出去将是对创作者最好的鼓励。

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

怎么利用 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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。