我想将Optional<CompletableFuture<T>>
转换为CompletableFuture<Optional<T>>
。是否有更惯用的方式不使用Optional.get()
?
Optional<CompletableFuture<T>> opt = Optional.empty();
CompletableFuture<Optional<T>> fut =
opt.isPresent() ?
opt.get().thenApply(Optional::of) :
CompletableFuture.completedFuture(Optional.empty());
答案 0 :(得分:1)
您可以使用map()
和orElseGet()
:
CompletableFuture<Optional<T>> fut = opt.map(f -> f.thenApply(Optional::of))
// now you have an Optional<CompletableFuture<Optional<T>>>
// just get rid of the outer Optional and you have the desired result:
.orElseGet(() -> CompletableFuture.completedFuture(Optional.empty()))
或者,您也可以执行以下操作:
opt.orElseGet(() -> CompletableFuture.completedFuture(null))
.thenApply(Optional::ofNullable)
主要区别在于,如果初始CompletableFuture
返回null
,那么这个不会抛出NullPointerException
。