/* All Contributors (C) 2020 */
package cn.edu.jxnu.examples.lambda;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

/**
 * Copyright © 2018 梦境迷离. All rights reserved.
 *
 * @description:组合多个CompletableFuture @Package: cn.edu.jxnu.lambda
 * @author: 梦境迷离
 * @date: 2018年3月27日 上午11:31:34
 */
public class CompletableFutureDemo3 {

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        System.out.println("*****************方法一*******************");
        // 1、使用thenCompose()方法
        // 2、将第一个CompletableFuture的计算结果传递给第二个CompletableFuture，继续进行计算
        CompletableFuture<Void> fu =
                CompletableFuture.supplyAsync(() -> calu(50))
                        .thenCompose(i -> CompletableFuture.supplyAsync(() -> calu(i)))
                        .thenApply(i -> Integer.toString(i))
                        .thenApply(str -> "\"" + str + "\"")
                        .thenAccept(System.out::println);
        fu.get();
        System.out.println("*****************方法二*******************");
        // 1、使用thenCombine()方法
        CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> calu(50));
        CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> calu(25));
        // 将future1与future2的计算结果相加
        CompletableFuture<Void> fu2 =
                future1.thenCombine(future2, (i, j) -> (i + j))
                        .thenApply(str -> "\"" + str + "\"")
                        .thenAccept(System.out::println);
        fu2.get();
    }

    public static Integer calu(Integer param) {
        return param / 2;
    }
}
