来自Optional <completablefuture <t>&gt;到CompletableFuture <optional <t>&gt;

时间:2015-10-31 08:28:14

标签: java optional completable-future

我想将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());

1 个答案:

答案 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