Pular para conteúdo

Processamento Tardio e Imediato

O processamento imediato realiza trabalho antes da solicitação do resultado. O processamento tardio o adia até o consumo. A avaliação tardia pode evitar cálculo desnecessário e apoiar pipelines; a imediata torna custo, erros, snapshots e responsabilidade pelos recursos mais previsíveis.

Três momentos distintos

Para um valor tardio, separe:

  1. construção da receita;
  2. percurso ou avaliação;
  3. liberação dos recursos retidos pela receita.

Operações intermediárias de Java Stream são tardias; uma operação terminal inicia o percurso. Um stream tem uso único. Se a fonte for mutável, o resultado depende do estado no momento do percurso, não necessariamente da declaração do pipeline.

List<String> normalized = names.stream()
        .filter(Objects::nonNull)
        .map(String::strip)
        .filter(name -> !name.isEmpty())
        .toList();

toList() estabelece um limite de materialização imediata, valioso antes de sair de uma transação, fechar um arquivo ou entregar dados a outra thread.

Riscos de persistência

Associações lazy de um ORM podem executar uma consulta ao serem percorridas. O acesso após fechar o contexto de persistência pode falhar; dentro de um laço, pode criar o problema N+1. Carregamento eager generalizado não resolve: pode carregar grafos não usados ou multiplicar linhas. Busque exatamente o necessário com projeção, consulta explícita ou grafo escolhido.

Concorrência e trabalho repetido

Inicialização tardia compartilhada entre threads exige publicação segura e uma política de falha. Uma referência thread-safe ainda pode permitir trabalho duplicado. Decida também se uma inicialização falha pode ser repetida. Uma sequência tardia que recalcula em todo percurso difere da memoização, que retém resultados.

Perguntas para decisão

  • É provável que o resultado não seja usado ou seja consumido parcialmente?
  • Os erros precisam ocorrer em um limite previsível?
  • A avaliação retém arquivo, conexão, transação ou grafo grande de objetos?
  • É necessário um snapshot estável?
  • Percursos repetidos repetirão trabalho caro ou observável?

Prefira materialização explícita nos limites de posse e recursos. Use avaliação tardia quando a avaliação adiada ou parcial tiver valor mensurável.