为什么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
相关产品推荐
相关产品推荐

