MST
星途 面试题库

面试题:Java CompletableFuture thenCompose处理复杂异步场景

在一个电商系统中,有两个异步操作。第一个操作是根据用户ID查询用户的购物车商品列表,第二个操作是根据购物车商品列表计算总价。请使用CompletableFuture的thenCompose方法实现这两个异步操作的解耦和顺序执行,并且要处理可能出现的异常情况,如查询购物车商品列表失败或计算总价失败,代码中需要体现合理的异常处理逻辑。
23.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class EcommerceSystem {

    // 模拟根据用户ID查询购物车商品列表的异步操作
    public static CompletableFuture<String> queryCartItems(String userId) {
        return CompletableFuture.supplyAsync(() -> {
            // 这里模拟查询操作,可能会失败
            if (Math.random() < 0.5) {
                throw new RuntimeException("查询购物车商品列表失败");
            }
            return "商品1,商品2,商品3";
        });
    }

    // 模拟根据购物车商品列表计算总价的异步操作
    public static CompletableFuture<Double> calculateTotalPrice(String cartItems) {
        return CompletableFuture.supplyAsync(() -> {
            // 这里模拟计算操作,可能会失败
            if (Math.random() < 0.5) {
                throw new RuntimeException("计算总价失败");
            }
            return 100.0;
        });
    }

    public static void main(String[] args) {
        String userId = "12345";
        CompletableFuture<Double> future = queryCartItems(userId)
              .thenCompose(EcommerceSystem::calculateTotalPrice)
              .exceptionally(ex -> {
                    System.out.println("发生异常: " + ex.getMessage());
                    return -1.0; // 返回一个默认值表示失败
                });

        try {
            double totalPrice = future.get();
            if (totalPrice != -1.0) {
                System.out.println("总价: " + totalPrice);
            }
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}