You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么Java的OptionalInt没有Optional<T>的or()方法?如何实现等效功能?

问题描述

在Java中,Optional<T>提供了or()方法,可用于链式拼接多个Optional实例,示例如下:

var o1  = Optional.<String>empty();
var o2 = Optional.of("some string");
Optional<String> o3 = o1.or(() -> o2); // o3 = o2

但是OptionalInt并没有提供该方法,请问如果要实现和上述代码类似的效果,且不使用如下的三元表达式写法,应该怎么操作?

var oi1 = OptionalInt.empty();
var oi2 = OptionalInt.empty();
OptionalInt oi3 = oi1.isPresent() ? oi1 : oi2;
解决方案
  • 方案1:使用Stream实现(Java 9+适用)
    利用OptionalInt自带的stream()方法,将多个OptionalInt实例合并为流,取第一个存在的值即可,天然支持多回退项扩展,不需要额外封装工具类:

    import java.util.OptionalInt;
    import java.util.stream.Stream;
    
    // 测试代码
    var oi1 = OptionalInt.empty();
    var oi2 = OptionalInt.of(456);
    var oi3 = Stream.of(oi1, oi2)
            .flatMapToInt(OptionalInt::stream)
            .findFirst();
    // 此时oi3的值和oi2一致
    
  • 方案2:封装自定义工具方法(兼容全Java版本,支持懒加载)
    如果需要兼容Java 8,或者希望和原生Optional.or()的调用习惯、懒加载特性保持对齐,可以自己封装静态工具方法:
    工具类代码:

    import java.util.OptionalInt;
    import java.util.function.Supplier;
    
    public class OptionalUtils {
        @SafeVarargs
        public static OptionalInt or(Supplier<OptionalInt>... optionalSuppliers) {
            for (Supplier<OptionalInt> supplier : optionalSuppliers) {
                OptionalInt opt = supplier.get();
                if (opt.isPresent()) {
                    return opt;
                }
            }
            return OptionalInt.empty();
        }
    }
    

    使用示例:

    var oi1 = OptionalInt.empty();
    var oi2 = OptionalInt.of(123);
    // 调用方式和原生Optional.or完全一致,支持传入多个回退项
    OptionalInt oi3 = OptionalUtils.or(() -> oi1, () -> oi2);
    

    这种写法实现了和原生or()完全一致的懒加载逻辑,只有前一个Optional为空时,才会执行下一个Supplier的逻辑获取后续Optional,适合后续Optional需要通过IO、计算等耗时操作生成的场景。

内容的提问来源于stack exchange,提问作者Paul C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 14:21:00