Mar*_*mus 7 java generics optional java-8
假设我有一个像这样的库方法(非常简短):
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();
}
}
Run Code Online (Sandbox Code Playgroud)
而且我想要一些不会返回值的东西,例如:
Library.</*What1*/>doSomethingWith(() -> {
foo();
return /*what2*/;
});
Run Code Online (Sandbox Code Playgroud)
我对没有返回值的泛型方法的第一直觉是生成类型Void并返回null,但是因为结果被包装在一个Optional会抛出异常.
什么是合理的占位符/*What1*/和/*what2*/看上去并不完全随机的像Integer和0?
[编辑]我试图避免Optional.ofNullable因为这里使用空来表示callable.call()没有正常完成.
如果您需要一个永远不会被使用的泛型参数的类型提示Void,那么JDK在某些情况下也会这样做,例如,当转换Runnable为CompletableFuture<T>它时使用Void for T.
如果你使用Optional.ofNullable那么你可以返回nullwhat2,这是唯一有效的值Void.
[edit]我试图避免Optional.ofNullable,因为这里使用empty表示callable.call()没有正常完成.
然后你正在使用错误的工具来完成工作.CompletionStage或者CompletableFuture有正确的语义.
我通常用来Boolean.TRUE标记成功,但你Void.class也可以回来。两者都很便宜,因为并非每次返回都会创建一个要丢弃的新对象。但Class<Void>不仅仅是Void它也可以起到标记某些东西的目的void。
正如已经提到的,您还可以创建自己的结果类/枚举。
或者你当然Optional.<Void>nothing()也可以回来。这样会产生一些结果Optional<Optional<Void>>,但也能达到目的。
如果您认为以上所有内容都很难看,那么我担心该 API 可能无法很好地满足您的需求。提出问题/拉取请求或寻找其他内容。
| 归档时间: |
|
| 查看次数: |
1084 次 |
| 最近记录: |