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、これは をスローしないことNullPointerExceptionです。

于 2016-12-02T19:02:09.983 に答える