JavaOptional.ifPresentOrElse 带返回值

ImJ*_*Lol 11 java null nullable option-type

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

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

Tom*_*ský 6

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

Consumer<InputType, OutputType> yourConsumer = ...;
Runnable<OutputType> yourRunnable = ...;
Optional<InputType> yourOptional = ...;
Run Code Online (Sandbox Code Playgroud)

你可以编写以下语句

OutputType result = yourOptional.map(yourConsumer).orElseGet(yourRunnable);
Run Code Online (Sandbox Code Playgroud)

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


ImJ*_*Lol 1

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

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();
}
Run Code Online (Sandbox Code Playgroud)