0Pricing
Scala for Backend Engineering & Functional Programming · Aula

A explicação da avaliação tardia

Calcule valores somente quando necessário.

A explicação da avaliação tardia é uma aula grátis de Scala for Backend Engineering & Functional Programming no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Scala for Backend Engineering & Functional Programming, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Scala for Backend Engineering & Functional Programming inclui 4 aulas no total.

O que é a avaliação tardia

Em Scala, a maioria dos valores é estrita: eles são calculados no momento em que são definidos. A avaliação tardia inverte essa lógica. Um valor tardio só é calculado quando é necessário pela primeira vez, nunca antes.

Isso é importante quando os cálculos são dispendiosos, podem falhar ou talvez nunca sejam usados. Por que pagar por um trabalho que ninguém solicita?

val estrita

Um val normal avalia imediatamente o lado direito, mesmo que você nunca o leia novamente.

Execute este código e observe que "computing" é impresso antes de "after". O trabalho acontece no momento da definição.

object Demo extends App {
  val x = { println("computing"); 42 }
  println("after")
  println(x)
}

lazy val

Prefixe um val com lazy para adiar a avaliação até o primeiro acesso.

Aqui, "after" é impresso primeiro; depois, "computing" é impresso somente quando x é lido. O resultado também é armazenado em cache: o corpo é executado no máximo uma vez.

object Demo extends App {
  lazy val x = { println("computing"); 42 }
  println("after")
  println(x)
  println(x)
}

Parâmetros por nome

Um parâmetro declarado como => A é passado por nome: o argumento não é avaliado até ser usado dentro do método.

Esse é o bloco básico da avaliação tardia. LazyList usa parâmetros por nome para que uma cauda nunca seja calculada até ser solicitada.

def maybe(cond: Boolean, value: => Int): Int =
  if (cond) value else 0

val r = maybe(false, { println("side"); 99 })
// "side" never prints; value was unused

Conheça LazyList

LazyList é a sequência tardia do Scala (ela substituiu a antiga Stream a partir da versão 2.13). A cabeça é avaliada avidamente, mas a cauda é tardia.

Os elementos são produzidos sob demanda e memorizados depois de calculados, para que a mesma célula nunca seja recalculada.

val ll = LazyList(1, 2, 3)
println(ll)
// prints LazyList(<not computed>) until forced

Forçando a avaliação

Uma LazyList permanece não avaliada até que você a force. Chamar toList, foreach ou imprimir cada elemento força as células.

O REPL mostra <not computed> para a cauda tardia. Ao forçá-la, os valores reais são revelados.

object Demo extends App {
  val ll = LazyList(1, 2, 3)
  println(ll.toList)
}

O operador #::

Você adiciona um elemento ao início de uma LazyList com #::. Diferentemente de :: de uma lista, o operando direito de #:: é passado por nome; portanto, a cauda não é criada até ser necessária.

Isso permite descrever sequências cuja parte restante é calculada de forma tardia.

val ll = 1 #:: 2 #:: 3 #:: LazyList.empty
println(ll.head)

Memoização

Depois que uma célula de uma LazyList é calculada, seu valor é armazenado. Lê-la novamente não tem custo, e a expressão que a produz não é executada duas vezes.

Execute este código: "calc" é impresso somente no primeiro acesso a cada elemento forçado, não nas leituras repetidas.

object Demo extends App {
  val ll = LazyList(1, 2).map { n =>
    println("calc " + n); n * 10
  }
  println(ll.head)
  println(ll.head)
}

A cauda tardia em ação

Como a cauda é tardia, você pode aplicar map a uma LazyList, e somente os elementos acessados serão calculados.

Aqui, "map" é impresso apenas uma vez, embora a lista tenha três elementos, porque somente a cabeça é forçada.

object Demo extends App {
  val r = LazyList(1, 2, 3).map { n =>
    println("map " + n); n + 1
  }
  println(r.head)
}

Por que a avaliação tardia ajuda

A avaliação tardia permite três coisas: evitar trabalho não utilizado, criar sequências infinitas e separar a descrição de um cálculo da quantidade que será executada.

Você escreve todo o pipeline uma vez; o consumidor decide quantos elementos solicitar.

Um cuidado

A avaliação tardia tem custos. Uma LazyList usa memoização; portanto, manter uma referência à cabeça mantém na memória todos os elementos já forçados. Para dados enormes ou infinitos, evite reter a cabeça.

Além disso, efeitos colaterais em código tardio são executados em momentos inesperados, o que pode dificultar a depuração.

Verificação rápida

Teste sua compreensão da avaliação tardia.

Recapitulação

A avaliação estrita executa o trabalho imediatamente; a avaliação tardia o adia até que seja necessário. lazy val e os parâmetros por nome (=> A) são os recursos básicos.

LazyList se baseia neles: cabeça imediata, cauda tardia e memorizada, forçada por meio de toList ou do acesso a um elemento. Em seguida, criaremos LazyLists manualmente.

Perguntas Frequentes

A aula “A explicação da avaliação tardia” é grátis?

Sim — o texto completo de “A explicação da avaliação tardia” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Scala for Backend Engineering & Functional Programming, atualize para CoddyKit PRO. O curso de Scala for Backend Engineering & Functional Programming inclui 4 aulas no total.

O que vou aprender em “A explicação da avaliação tardia”?

Calcule valores somente quando necessário. Você pratica Scala for Backend Engineering & Functional Programming com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Scala for Backend Engineering & Functional Programming?

Nenhuma experiência prévia é necessária. Scala for Backend Engineering & Functional Programming no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “A explicação da avaliação tardia”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Scala for Backend Engineering & Functional Programming?

Sim. Cada aula de Scala for Backend Engineering & Functional Programming inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. A explicação da avaliação tardia
  2. Construindo uma LazyList
  3. Fluxos infinitos
  4. Obtendo e filtrando de forma tardia
← Voltar para Scala for Backend Engineering & Functional Programming