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();
}
假设以下声明 (编辑:注意 Consumer
和 Runnable
是来自@ImJustACowLol 的自我回答的接口,而不是 java.util
接口。对于自我的情况答案已被删除,接口与 java.util
中的接口相同,除了功能接口方法具有通用 return 类型而不是 void
类型。无论如何,应该选择不同的命名。):
Consumer<InputType, OutputType> yourConsumer = ...;
Runnable<OutputType> yourRunnable = ...;
Optional<InputType> yourOptional = ...;
您可以编写以下语句
OutputType result = yourOptional.map(yourConsumer).orElseGet(yourRunnable);
恕我直言,这虽然不适合单一方法调用,但仍然足够简洁和可读。
在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();
}
假设以下声明 (编辑:注意 Consumer
和 Runnable
是来自@ImJustACowLol 的自我回答的接口,而不是 java.util
接口。对于自我的情况答案已被删除,接口与 java.util
中的接口相同,除了功能接口方法具有通用 return 类型而不是 void
类型。无论如何,应该选择不同的命名。):
Consumer<InputType, OutputType> yourConsumer = ...;
Runnable<OutputType> yourRunnable = ...;
Optional<InputType> yourOptional = ...;
您可以编写以下语句
OutputType result = yourOptional.map(yourConsumer).orElseGet(yourRunnable);
恕我直言,这虽然不适合单一方法调用,但仍然足够简洁和可读。