CompletableFuture 使用

发布时间 2023-08-28 23:21:32作者: 我想喝杨枝甘露~
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

/**
 * @Author: TrueNewBee
 * @Date: 2023/8/28 23:05
 * @Github: https://github.com/TrueNewBee
 * @Description:  通过 CompletableFuture 解决多个查询语句,并把所查询解决汇总封装成一条数据的痛点问题
 */
public class Test2 {
    public static void main(String[] args) {
        // 模拟传来的10个卡号
        List<String> cardNumbers = Arrays.asList("1234567890", "2345678901", "3456789012", "4567890123", "5678901234",
                "6789012345", "7890123456", "8901234567", "9012345678", "0123456789");
        // 一只数据库DAO会返回一个list,所以个list对象,所以先写伪代码,具体根据业务来
        List<CompletableFuture<String>> futures = new ArrayList<>();

        // 这里可以是一个 tra对象/ 一些查询参数,具体按业务来
        for (String cardNumber : cardNumbers) {
            CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
                // 在这里执行数据库查询操作,并返回查询结果
                // 这里只是模拟查询操作,实际需要根据具体的数据库操作进行实现
                //return query(xx,xx,xx,xx)
                return "Query result for card number: " + cardNumber;
            });

            futures.add(future);
        }

        CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));

        try {
            allFutures.get(); // 等待所有查询操作完成
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }

        List<String> results = new ArrayList<>();
        // 由于查询结果本来就是一个list ,直接追加即可
        // 可以根据需求去修改下
        for (CompletableFuture<String> future : futures) {
            try {
                String result = future.get(); // 获取每个查询操作的结果
                results.add(result);
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        }

        System.out.println("Query results:");
        for (String result : results) {
            System.out.println(result);
        }
    }
}

在上面的代码中,我们首先定义了一个包含10个卡号的列表cardNumbers。然后,我们创建了一个CompletableFuture的列表futures,用于保存每个查询操作的CompletableFuture对象。

在循环中,我们为每个卡号创建一个CompletableFuture对象,并在其supplyAsync方法中执行数据库查询操作。这里只是简单地返回了一个带有卡号的查询结果的字符串,你需要根据具体的数据库操作进行实现。

将每个CompletableFuture对象添加到futures列表中后,我们使用CompletableFuture.allOf方法创建了一个新的CompletableFuture对象allFutures,用于等待所有查询操作完成。

然后,我们使用allFutures.get()方法来等待所有查询操作完成。在这之后,我们遍历每个CompletableFuture对象,使用get()方法获取每个查询操作的结果,并将结果添加到results列表中。

最后,我们打印出所有查询结果。你可以根据实际需求对结果进行进一步处理。