MST
星途 面试题库

面试题:Java CompletableFuture thenCombine处理复杂业务场景

现有两个异步任务,任务A从数据库中查询用户信息(返回User对象),任务B根据用户ID从另一个数据源查询用户的权限信息(返回Permission对象)。User类包含用户ID等字段,Permission类包含与用户ID关联的权限相关信息。请使用CompletableFuture的thenCombine方法,将用户信息和权限信息合并成一个新的包含完整用户及权限信息的UserWithPermission类对象并返回。同时考虑异常处理,若任一任务出错,要能正确捕获并处理。请编写Java代码实现。
42.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

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

class User {
    private Long id;
    // 其他用户信息字段

    public User(Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }
}

class Permission {
    private Long userId;
    // 其他权限信息字段

    public Permission(Long userId) {
        this.userId = userId;
    }

    public Long getUserId() {
        return userId;
    }
}

class UserWithPermission {
    private User user;
    private Permission permission;

    public UserWithPermission(User user, Permission permission) {
        this.user = user;
        this.permission = permission;
    }

    @Override
    public String toString() {
        return "UserWithPermission{" +
                "user=" + user +
                ", permission=" + permission +
                '}';
    }
}

public class AsyncTaskExample {

    public CompletableFuture<UserWithPermission> combineTasks() {
        CompletableFuture<User> taskA = CompletableFuture.supplyAsync(() -> {
            // 模拟从数据库查询用户信息
            return new User(1L);
        });

        CompletableFuture<Permission> taskB = CompletableFuture.supplyAsync(() -> {
            // 模拟根据用户ID从另一个数据源查询权限信息
            return new Permission(1L);
        });

        return taskA.thenCombine(taskB, (user, permission) -> new UserWithPermission(user, permission))
               .exceptionally(ex -> {
                    System.out.println("任务出现异常: " + ex.getMessage());
                    return null;
                });
    }

    public static void main(String[] args) {
        AsyncTaskExample example = new AsyncTaskExample();
        CompletableFuture<UserWithPermission> result = example.combineTasks();
        result.thenAccept(System.out::println).join();
    }
}