CompletableFutureを勉強中。thenApplyとthenComposeで混乱中。追記:そしてうらがみさんに色々教えてもらいました!(∩´∀`)∩ワーイ

FluxとかMonoの勉強しようと思って、よこみちにそれて。

bufferings.hatenablog.com

その流れで、Java8にCompletableFutureなるものがあることを知り。

この章だけ読んだ。

www.safaribooksonline.com

面白かったのでまた別の機会にまとめをメモしときたいなと思いつつ。今日は、疑問が。

thenApplyとthenCompose

確かに!ふむふむ。

そして、混乱

書籍のサンプルコードはこんな流れなんだけど。

shops.stream()
    // 店舗の価格APIを非同期で呼び出し
    .map(shop -> CompletableFuture.supplyAsync(() -> shop.getPrice(product)))
    // 結果の文字列をパースして価格を取得
    .map(future -> future.thenApply(Quote::parse))
    // 割引APIを非同期で呼び出して、価格から割引結果を取得
    .map(future -> future.thenCompose(
        quote -> CompletableFuture.supplyAsync(() -> Discount.applyDiscount(quote))))
    .collect(toList());

この、thenComposeを使う代わりに、thenApplyで同期的に呼び出しても、いいんじゃないか?と思ってしまって混乱。既に、最初のgetPriceのところで別のスレッドで実行されるようになってるから、そのままそのスレッドでやってしまえば・・・と思ったんだけど。thenComposeする利点ってなんだろう?

もうちょっと考えてみる。

追記:そしてうらがみさんに色々教えてもらいました!(∩´∀`)∩ワーイ

色々教えてもらってすっきりしました!ありがとうございました!