2

我想转换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());
4

1 回答 1

3

您可以使用 和 的组合进行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,这个将不会抛出 a NullPointerException

于 2016-12-02T19:02:09.983 回答