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:
-
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 -
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); }); -
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());