Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Optional.ifpresentorese和返回值_Java_Null_Optional_Nullable - Fatal编程技术网

Java Optional.ifpresentorese和返回值

Java Optional.ifpresentorese和返回值,java,null,optional,nullable,Java,Null,Optional,Nullable,在Java中,我最近开始在代码中更多地采用可选的类型。这允许更好的null值处理,在某种程度上还允许更安全的代码Optional具有ifpresentorese方法,允许您在存在值时执行特定操作,或在不存在值时执行特定操作。但是,此方法不允许您声明返回类型 是否有一种简单的方法可以使用optionals和类似ifpresentorese的方法在展开可选时返回值?不幸的是,子类化可选是不可能的,因为它的所有初始值设定项都是私有的。因此,任何解决方案都必须针对不是Optional子类的类或类型。下面

在Java中,我最近开始在代码中更多地采用
可选的
类型。这允许更好的
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都错了,我在另一个答案上构建了我的答案,他/她选择了这样不吉利的命名。我将编辑答案以警告这些类型是否t
java.util
类型。
Consumer<InputType, OutputType> yourConsumer = ...;
Runnable<OutputType> yourRunnable = ...;
Optional<InputType> yourOptional = ...;
OutputType result = yourOptional.map(yourConsumer).orElseGet(yourRunnable);