导读:本期聚焦于小伙伴创作的《如何在 Java 中利用 Optional.or() 在 Java 9 以后实现流式的默认可选值产生器切换逻辑》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何在 Java 中利用 Optional.or() 在 Java 9 以后实现流式的默认可选值产生器切换逻辑》有用,将其分享出去将是对创作者最好的鼓励。

在Java 9之前,当我们处理Optional对象时,如果当前Optional为空,想要切换到另一个可选值产生器获取默认值,往往需要写多层判断或者复杂的逻辑分支,代码可读性较差。Java 9为Optional类新增的or方法,很好地解决了这个问题,支持通过流式调用的方式依次尝试不同的可选值产生器,实现灵活的默认可选值切换逻辑。

如何在 Java 中利用 Optional.or() 在 Java 9 以后实现流式的默认可选值产生器切换逻辑

Optional.or() 方法的基本定义

Optional的or方法接收一个Supplier<? extends Optional<? extends T>>类型的参数,当当前Optional对象有值时,直接返回当前对象;如果当前对象为空,就会调用传入的Supplier获取新的Optional对象返回。方法签名如下:

public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier) {
    Objects.requireNonNull(supplier);
    if (isPresent()) {
        return this;
    } else {
        @SuppressWarnings("unchecked")
        Optional<T> r = (Optional<T>) supplier.get();
        return Objects.requireNonNull(r);
    }
}

传统默认可选值处理逻辑的问题

假设我们有三个可选值产生器,依次尝试获取用户信息,第一个获取不到就尝试第二个,第二个也获取不到就尝试第三个,传统实现方式如下:

import java.util.Optional;

public class TraditionalOptionalDemo {
    // 模拟第一个产生器,返回空Optional
    private static Optional<String> getFirstUser() {
        return Optional.empty();
    }

    // 模拟第二个产生器,返回空Optional
    private static Optional<String> getSecondUser() {
        return Optional.empty();
    }

    // 模拟第三个产生器,返回有效值
    private static Optional<String> getThirdUser() {
        return Optional.of("默认用户");
    }

    public static void main(String[] args) {
        Optional<String> result;
        Optional<String> first = getFirstUser();
        if (first.isPresent()) {
            result = first;
        } else {
            Optional<String> second = getSecondUser();
            if (second.isPresent()) {
                result = second;
            } else {
                result = getThirdUser();
            }
        }
        System.out.println(result.get());
    }
}

这种实现方式嵌套了多层if-else判断,当产生器数量增多时,代码会变得越来越臃肿,可读性和维护性都会下降。

使用 or() 实现流式默认可选值产生器切换

利用or方法的链式调用特性,我们可以把上面的逻辑改写成更简洁的流式形式:

import java.util.Optional;

public class OptionalOrDemo {
    // 模拟第一个产生器,返回空Optional
    private static Optional<String> getFirstUser() {
        return Optional.empty();
    }

    // 模拟第二个产生器,返回空Optional
    private static Optional<String> getSecondUser() {
        return Optional.empty();
    }

    // 模拟第三个产生器,返回有效值
    private static Optional<String> getThirdUser() {
        return Optional.of("默认用户");
    }

    public static void main(String[] args) {
        Optional<String> result = getFirstUser()
                .or(() -> getSecondUser())
                .or(() -> getThirdUser());
        System.out.println(result.get());
    }
}

这段代码的逻辑非常清晰:首先尝试获取第一个可选值,如果为空就调用第一个or方法尝试第二个产生器,如果第二个还为空,就调用第二个or方法尝试第三个产生器,最终得到非空的可选值。整个过程是链式流式调用,没有嵌套的逻辑分支,代码简洁很多。

or() 方法的注意事项

  • or方法传入的Supplier不能返回null,否则会抛出NullPointerException,如果产生器可能返回null,需要在Supplier内部做非空处理。
  • or方法是惰性执行的,只有当前Optional为空时才会调用后续的Supplier,不会提前执行所有产生器的逻辑,不会造成不必要的性能损耗。
  • or方法返回的是一个新的Optional对象,不会修改原有的Optional实例,符合Optional不可变的特性。

适用场景总结

or方法非常适合需要依次尝试多个可选值来源,直到获取到有效值的场景,比如多数据源查询、多配置项读取、降级逻辑处理等。相比传统的if-else嵌套或者flatMap链式处理,or方法的语义更明确,代码更简洁,是Java 9之后处理可选值默认逻辑的更优选择。

JavaOptionalor()流式处理默认可选值修改时间:2026-07-21 00:12:29

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