Java 使用void方法跨可选对象映射的惯用方法
我有一个Java 使用void方法跨可选对象映射的惯用方法,java,java-8,optional,Java,Java 8,Optional,我有一个可选的,如果有,我想调用一个包含其内容的函数,如果没有则抛出。问题是map不会采用void方法 File file; //... Optional maybeFile = Optional.ofNullable(file); //.. maybeFile .map(f -> writeTo(f, "stuff")) //Compile error: writeTo() is void .orElseThrow
可选的
,如果有,我想调用一个包含其内容的函数,如果没有则抛出。问题是map
不会采用void方法
File file;
//...
Optional maybeFile = Optional.ofNullable(file);
//..
maybeFile
.map(f -> writeTo(f, "stuff")) //Compile error: writeTo() is void
.orElseThrow(() -> new IllegalStateException("File not set"));
在保持
writeTo
无效的同时,我应该如何实现这一点?或lsetrow
返回文件对象(如果存在),这样您就可以将其作为
writeTo(maybeFile.orElseThrow(() -> new IllegalStateException("File not set")), "stuff");
您可以使用
ifpresentorese
,它需要两个使用者:
maybeFile.ifPresentOrElse(
f -> writeTo(f, "stuff"),
() -> {
//absent, so throw exception
throw new IllegalStateException("File not set");
});
虽然没有真正的优势,但您始终可以将方法签名更改为:
Void writeTo(…)
然后将结果捕获为Optional.of(writeTo())
由于您不关心(这是一种void
返回类型),您可以简单地执行以下操作:
Optional.ofNullable(f)
.map(file -> {
writeTo(file, "");
return "dummy";
})
.orElseThrow(() -> new IllegalStateException("File not set"));
但是,这对我来说似乎是非常错误的,如果(f!=null){…}可能你想要
peek
而不是map
?@Druckles nopeek
在可选的中…这一点很好。我不知道为什么我总是认为有;-)这仅在Java9中可用