【发布时间】:2016-12-28 10:55:19
【问题描述】:
假设我有一个这样的库方法(非常简略):
public static <V> Optional<V> doSomethingWith(Callable<V> callable) {
try {
return Optional.of(callable.call());
} catch (Exception ex) {
// Do something with ex
return Optional.empty();
}
}
我想要一些不返回值的东西,比如:
Library.</*What1*/>doSomethingWith(() -> {
foo();
return /*what2*/;
});
对于不返回值的泛型方法,我的第一直觉是创建类型 Void 并返回 null,但是因为结果被包装在 Optional 中,这会引发异常。
/*What1*/ 和 /*what2*/ 的合理占位符看起来不像 Integer 和 0 那样完全随机?
[编辑]
我试图避免Optional.ofNullable,因为这里使用空表示callable.call() 没有正常完成。
【问题讨论】:
-
你不能改变库方法来使用
Optional.ofNullable吗?如果它总是存在,那么返回可选的意义何在? -
Optional是a container object which may or may not contain a non-null value. 那么问题是什么? -
@MarkJeronimus 如果您不能修改库,似乎如果没有像未经检查的演员这样的丑陋黑客,您就无法合法地做到这一点。您能否考虑将可调用对象的类型更改为其他类型(例如
Callable<Boolean>并返回Boolean.TRUE)? -
您还可以创建一个自定义枚举(如
Result或其他),其中只有一个常量(如EMPTY或其他)。
标签: java generics java-8 optional