0Pricing
Scala for Backend Engineering & Functional Programming · Leçon

La paresse expliquée

Ne calculez les valeurs qu’au moment nécessaire.

La paresse expliquée est une leçon Scala for Backend Engineering & Functional Programming gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Scala for Backend Engineering & Functional Programming, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Scala for Backend Engineering & Functional Programming comprend 4 leçons au total.

Qu'est-ce que l'évaluation différée ?

En Scala, la plupart des valeurs sont strictes : elles sont calculées dès que vous les définissez. L'évaluation différée inverse ce fonctionnement. Une valeur différée n'est calculée que lorsqu'elle est nécessaire pour la première fois, jamais avant.

C'est utile lorsque les calculs sont coûteux, peuvent échouer ou ne seront peut-être jamais utilisés. Pourquoi payer pour un travail que personne ne demande ?

val stricte

Un val normal évalue immédiatement son membre de droite, même si vous ne le lisez plus jamais.

Exécutez ce code et remarquez que « computing » s'affiche avant « after ». Le travail est effectué au moment de la définition.

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

lazy val

Préfixez un val avec lazy pour différer son évaluation jusqu'au premier accès.

Ici, « after » s'affiche d'abord, puis « computing » seulement lorsque x est lu. Le résultat est également mémorisé : le corps s'exécute au plus une fois.

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

Paramètres par nom

Un paramètre déclaré comme => A est transmis par nom : l'argument n'est évalué que lorsqu'il est utilisé à l'intérieur de la méthode.

C'est le fondement de l'évaluation différée. LazyList utilise des paramètres par nom afin que sa queue ne soit jamais calculée avant d'être demandée.

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

Découvrez LazyList

LazyList est la séquence différée de Scala (elle a remplacé l'ancien Stream depuis la version 2.13). Sa tête est évaluée immédiatement, mais sa queue est différée.

Les éléments sont produits à la demande et mémorisés une fois calculés ; la même cellule n'est donc jamais recalculée deux fois.

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

Forcer l'évaluation

Une LazyList reste non évaluée jusqu'à ce que vous la forciez. Appeler toList, foreach ou afficher chaque élément force les cellules.

La REPL affiche <not computed> pour la fin paresseuse. Le forçage révèle les vraies valeurs.

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

L’opérateur #::

Vous ajoutez un élément au début d’une LazyList avec #::. Contrairement à :: des listes, l’opérande droit de #:: est évalué par nom : la fin n’est donc construite qu’en cas de besoin.

Cela vous permet de décrire des séquences dont la suite est calculée paresseusement.

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

Mémorisation

Une fois qu’une cellule de LazyList est calculée, sa valeur est enregistrée. La relire ne coûte rien et l’expression qui la produit n’est pas exécutée une seconde fois.

Exécutez ceci : « calc » s’affiche uniquement lors du premier accès à chaque élément forcé, et non lors des lectures répétées.

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

La fin paresseuse en action

Comme la fin est paresseuse, vous pouvez appliquer map à une LazyList et seuls les éléments auxquels vous accédez sont calculés.

Ici, « map » ne s’affiche qu’une seule fois, même si la liste contient trois éléments, car seul le premier élément est forcé.

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

Pourquoi la paresse est utile

La paresse permet d’éviter le travail inutile, de construire des séquences infinies et de dissocier la description d’un calcul de la quantité réellement exécutée.

Vous écrivez tout le pipeline une seule fois ; le consommateur décide du nombre d’éléments à extraire.

Une mise en garde

La paresse a un coût. Une LazyList mémorise ses valeurs : conserver une référence vers son premier élément maintient en mémoire chaque élément forcé. Pour des données volumineuses ou infinies, évitez de conserver le premier élément.

De plus, les effets de bord dans du code paresseux se produisent à des moments inattendus, ce qui peut compliquer le débogage.

Vérification rapide

Testez votre compréhension de l’évaluation paresseuse.

Récapitulatif

L’évaluation stricte exécute le travail immédiatement ; l’évaluation paresseuse le diffère jusqu’à ce qu’il soit nécessaire. lazy val et les paramètres évalués par nom (=> A) en sont les primitives.

LazyList s’appuie dessus : premier élément évalué immédiatement, fin paresseuse et mémorisée, forcée via toList ou l’accès à un élément. Ensuite, nous construirons des LazyLists à la main.

Questions Fréquemment Posées

La leçon « La paresse expliquée » est-elle gratuite ?

Oui — le texte complet de « La paresse expliquée » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Scala for Backend Engineering & Functional Programming, passe à CoddyKit PRO. Le cours Scala for Backend Engineering & Functional Programming comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « La paresse expliquée » ?

Ne calculez les valeurs qu’au moment nécessaire. Tu pratiques Scala for Backend Engineering & Functional Programming avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Scala for Backend Engineering & Functional Programming ?

Aucune expérience préalable n'est requise. Scala for Backend Engineering & Functional Programming sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.

Combien de temps prend la leçon « La paresse expliquée » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Scala for Backend Engineering & Functional Programming ?

Oui. Chaque leçon Scala for Backend Engineering & Functional Programming inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. La paresse expliquée
  2. Construire une LazyList
  3. Flux infinis
  4. Prendre et filtrer paresseusement
← Retour à Scala for Backend Engineering & Functional Programming