Sobes.tech
Middle

Para que serve o CompletableFuture em Java?

sobes.tech IA

Resposta da IA

CompletableFuture é utilizado para execução assíncrona de tarefas e composição de operações assíncronas. Ele representa o resultado de uma operação assíncrona que pode ser concluída no futuro.

As principais vantagens e razões para usá-lo:

  • Execução assíncrona: Permite executar tarefas em segundo plano sem bloquear o thread principal.
  • Composição de operações assíncronas: Permite encadear várias tarefas assíncronas, definindo como elas devem ser executadas sequencialmente ou em paralelo, e processar seus resultados.
  • Tratamento de exceções: Fornece mecanismos para gerenciar erros em tarefas assíncronas.
  • Flexibilidade: Suporta diferentes métodos para processar o resultado (por exemplo, aplicar funções, executar a próxima tarefa) e definir os threads de execução.

Exemplos de uso:

  1. Executar várias tarefas independentes em paralelo e esperar que elas terminem:

    // Exemplo de execução paralela de duas tarefas
    CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
        // Operação longa 1
        return "Resultado 1";
    });
    
    CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
        // Operação longa 2
        return "Resultado 2";
    });
    
    CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(future1, future2);
    
    combinedFuture.join(); // Esperar a conclusão de ambas as tarefas
    
  2. Executar operações assíncronas sequenciais:

    // Exemplo de execução sequencial de tarefas
    CompletableFuture<String> initialFuture = CompletableFuture.supplyAsync(() -> "Valor inicial");
    
    CompletableFuture<Integer> transformedFuture = initialFuture.thenApplyAsync(result -> {
        // Transformar o resultado
        return result.length();
    });
    
    transformedFuture.thenAccept(length -> {
        System.out.println("Comprimento da string: " + length);
    });
    
  3. Tratamento de exceções:

    // Exemplo de tratamento de exceção
    CompletableFuture<String> errorFuture = CompletableFuture.supplyAsync(() -> {
        if (true) {
            throw new RuntimeException("Ocorreu um erro");
        }
        return "Sucesso";
    }).exceptionally(ex -> {
        System.err.println("Tratamento de erro: " + ex.getMessage());
        return "Erro tratado"; // Valor de reserva
    });
    
    System.out.println(errorFuture.join());