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 unusedConheç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 forcedForç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
- A explicação da avaliação tardia
- Construindo uma LazyList
- Fluxos infinitos
- Obtendo e filtrando de forma tardia