Java Optional.ifPresentOrElse 具有 return 值

Java Optional.ifPresentOrElse with return value

在Java中,我最近开始在我的代码中采用更多的Optional类型。这允许更好的 null 值处理,并且在某种程度上也允许更安全的代码。 Optional 具有 ifPresentOrElse 方法,允许您在值存在时执行特定操作,或在值不存在时执行特定操作。但是,此方法不允许您声明 return 类型。

有没有一种简单的方法可以在展开 Optional 时使用可选值和类似 ifPresentOrElse 的方法来处理 return 值?

不幸的是,subclassing Optional 是不可能的,因为它的所有初始化器都是 private。因此,任何解决方案都必须针对 class 或不是 Optional 的子 class 的类型。下面的便捷方法 + 接口提供了所需的行为。

public interface Consumer<InputType, OutputType> {
    public OutputType consume(InputType inputType);
}

public interface Runnable<OutputType> {
    public OutputType run();
}

public static <ReturnType, OptionalType> ReturnType ifPresentOrElse(Optional<OptionalType> optional, Consumer<OptionalType, ReturnType> consumer, Runnable<ReturnType> runnable) {
    return optional.isPresent() ? consumer.consume(optional.get()) : runnable.run();
}

假设以下声明 (编辑:注意 ConsumerRunnable 是来自@ImJustACowLol 的自我回答的接口,而不是 java.util 接口。对于自我的情况答案已被删除,接口与 java.util 中的接口相同,除了功能接口方法具有通用 return 类型而不是 void 类型。无论如何,应该选择不同的命名。):

Consumer<InputType, OutputType> yourConsumer = ...;
Runnable<OutputType> yourRunnable = ...;
Optional<InputType> yourOptional = ...;

您可以编写以下语句

OutputType result = yourOptional.map(yourConsumer).orElseGet(yourRunnable);

恕我直言,这虽然不适合单一方法调用,但仍然足够简洁和可读。