Java Optional.ifpresentorese和返回值
在Java中,我最近开始在代码中更多地采用Java Optional.ifpresentorese和返回值,java,null,optional,nullable,Java,Null,Optional,Nullable,在Java中,我最近开始在代码中更多地采用可选的类型。这允许更好的null值处理,在某种程度上还允许更安全的代码Optional具有ifpresentorese方法,允许您在存在值时执行特定操作,或在不存在值时执行特定操作。但是,此方法不允许您声明返回类型 是否有一种简单的方法可以使用optionals和类似ifpresentorese的方法在展开可选时返回值?不幸的是,子类化可选是不可能的,因为它的所有初始值设定项都是私有的。因此,任何解决方案都必须针对不是Optional子类的类或类型。下面
可选的类型。这允许更好的null
值处理,在某种程度上还允许更安全的代码Optional
具有ifpresentorese
方法,允许您在存在值时执行特定操作,或在不存在值时执行特定操作。但是,此方法不允许您声明返回类型
是否有一种简单的方法可以使用optionals和类似ifpresentorese的方法在展开可选时返回值?不幸的是,子类化可选是不可能的,因为它的所有初始值设定项都是私有的。因此,任何解决方案都必须针对不是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();
}
公共静态返回类型IfPresentOverse(可选、使用者使用者使用者、可运行){
返回optional.isPresent()?consumer.consume(optional.get()):runnable.run();
}
假设以下声明(编辑:注意Consumer
和Runnable
是@ImJustACowLol的自应答接口,而不是java.util
接口。如果删除了自应答,则接口与java.util
中的接口相同,只是函数接口方法具有通用返回类型,而不是void
e应选择不同的名称。):
不可否认,它不适合于单个方法调用,尽管仍然足够简洁易读,IMHO.要获取返回值,请将opt.ifpresentorese(a,b)
替换为r=opt.map(a).orElseGet(b)
@Andreas需要注意的是:这涉及到将a
从消费者
转换为功能
和b
从可运行
转换为供应商
@Slaw,这将是目标的一个要求,即返回值,而不管它们是如何使用的,也不是真正使用映射
或orElseGet
这就是这个要求,它是OP想要什么的先决条件。@Andreas说得通。我理解这个问题是想在展开原始值(无论它是否存在)的同时对可选的
执行操作。有点像Kotlin中的,
。虽然您的解决方案仍然能够做到这一点,但读起来却不一样。但是,在看到我看到他们是按照您的建议来做的。@TomášZáluský的解决方案是一个很好的折衷方案,没有添加锅炉板代码。@IceMan Tomášš的解决方案将无法编译。创建自定义接口他re是不必要的。您的消费者
界面实际上是一个功能
,而您的可运行
界面实际上是一个供应商
。考虑到这一点,您可以使用不涉及创建实用方法的方法。请注意,Tomáš的答案实际上与Andrea建议的解决方案相同s除了Tomáš之外使用了错误的类型。假设java.util.Optional
:(1)java.lang.Runnable
接口不是泛型的;(2)map
方法需要java.util.function.function
;(3)orElseGet
方法需要一个java.util.function.Supplier
@Slaw您是对的,当然,我假设了ImJustACowLol答案中声明的类型的声明。我和ImJustACowLol都错了,我在另一个答案上构建了我的答案,他/她选择了这样不吉利的命名。我将编辑答案以警告这些类型是否tjava.util
类型。
Consumer<InputType, OutputType> yourConsumer = ...;
Runnable<OutputType> yourRunnable = ...;
Optional<InputType> yourOptional = ...;
OutputType result = yourOptional.map(yourConsumer).orElseGet(yourRunnable);