我有一个Optional
,想调用带有其内容的函数(如果存在),否则抛出。问题是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
无效的同时实现这一点?
答案 0 :(得分:5)
orElseThrow
返回File对象(如果存在),因此您可以将其写为
writeTo(maybeFile.orElseThrow(() -> new IllegalStateException("File not set")), "stuff");
答案 1 :(得分:1)
您可以使用ifPresentOrElse
,这需要2个使用者:
maybeFile.ifPresentOrElse(
f -> writeTo(f, "stuff"),
() -> {
//absent, so throw exception
throw new IllegalStateException("File not set");
});
答案 2 :(得分:1)
尽管没有真正的优势,但是您始终可以将方法签名更改为:
Void writeTo(...)
,然后将结果捕获为Optional.of(writeTo())
答案 3 :(得分:1)
由于您不必关心结果(返回值是void
),因此只需执行以下操作即可:
Optional.ofNullable(f)
.map(file -> {
writeTo(file, "");
return "dummy";
})
.orElseThrow(() -> new IllegalStateException("File not set"));
但是再说一次,这对我来说似乎很不对劲,而不是简单的if(f!= null) { ... }