Scala for Backend Engineering & Functional Programming · Leçon

Prendre et filtrer paresseusement

Extrayez une portion de flux infinis.

Leçon 4 sur 413 étapes

Prendre et filtrer paresseusement est une leçon Scala for Backend Engineering & Functional Programming gratuite sur CoddyKit. Ceci est la leçon 4 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.

Consommer paresseusement

La véritable valeur d’une LazyList apparaît lorsque vous la consommez. Les opérations comme take, filter et map restent paresseuses et ne calculent que les cellules que vous finissez par forcer.

Cette leçon présente les principaux transformateurs et la manière d’arrêter la paresse au bon moment.

take(n)

take(n) renvoie une LazyList contenant au plus les n premiers éléments, qui reste elle-même paresseuse. Rien n’est calculé avant que vous ne forciez le résultat.

C’est la manière sûre de limiter un flux infini.

object Demo extends App {
  val first5 = LazyList.from(1).take(5)
  println(first5.toList)
}

takeWhile

takeWhile(p) fournit les éléments tant que le prédicat est vérifié, puis s’arrête au premier échec.

Sur un flux infini, c’est une condition d’arrêt claire qui ne nécessite pas de connaître un nombre d’éléments.

object Demo extends App {
  val small = LazyList.from(1).takeWhile(_ < 6)
  println(small.toList)
}

drop et dropWhile

drop(n) ignore les n premiers éléments ; dropWhile(p) ignore les éléments tant que le prédicat est vérifié. Les deux renvoient le reste de manière paresseuse.

Utilisez-les pour avancer dans un flux avant d’en prendre une portion.

object Demo extends App {
  val rest = LazyList.from(1).drop(3).take(3)
  println(rest.toList)
}

Filtrage paresseux

filter est paresseux sur une LazyList : il ne teste les éléments que lorsque le consommateur en aval les demande.

Associé à take, il traite exactement assez d’éléments sources pour satisfaire la demande, et pas davantage.

object Demo extends App {
  val evens = LazyList.from(1).filter(_ % 2 == 0)
  println(evens.take(4).toList)
}

Observer la demande

Ajoutez une instruction d’affichage dans le prédicat pour observer le petit nombre d’éléments testés. Le filtre ne s’exécute que jusqu’à ce que take soit satisfait.

Exécutez ceci : le nombre de lignes « check » montre une évaluation pilotée par la demande, et non le parcours du flux entier.

object Demo extends App {
  val r = LazyList.from(1).filter { n =>
    println("check " + n); n % 3 == 0
  }
  println(r.take(2).toList)
}

Enchaîner map et filter

Vous pouvez enchaîner les transformateurs ; tout le pipeline reste paresseux et se fusionne élément par élément. Chaque élément source passe par map puis filter uniquement lorsqu’il est extrait.

Aucune collection intermédiaire complète n’est construite.

object Demo extends App {
  val r = LazyList.from(1).map(_ * _).filter(_ > 10).take(3)
  println(r.toList)
}

find : s’arrêter tôt

find(p) renvoie le premier élément correspondant sous forme d’Option, en ne forçant que les éléments jusqu’à celui-ci. C’est idéal pour rechercher dans un flux infini.

Dès qu’une correspondance est trouvée, l’évaluation s’arrête immédiatement.

object Demo extends App {
  val firstBig = LazyList.from(1).find(_ * _ > 50)
  println(firstBig)
}

headOption et exists

headOption consulte le premier élément en toute sécurité ; exists(p) force les éléments jusqu’à trouver une correspondance, ou indéfiniment si aucune n’existe. Utilisez exists sur des flux infinis uniquement lorsqu’une correspondance est garantie.

Les deux s’arrêtent dès que possible.

object Demo extends App {
  val has = LazyList.from(1).exists(_ == 7)
  println(has)
}

Forcer un résultat

Les transformateurs paresseux décrivent le travail ; une opération terminale le force. toList, foreach, sum et foldLeft consomment le flux borné et produisent une valeur concrète.

Limitez toujours un flux infini avant d’utiliser une opération terminale qui doit le parcourir entièrement.

object Demo extends App {
  val total = LazyList.from(1).take(100).sum
  println(total)
}

Pièges du filtrage

Un filter qui ne trouve aucune correspondance transforme un take borné en recherche infinie. LazyList.from(1).filter(_ < 0).take(1) reste bloqué indéfiniment.

Assurez-vous que les prédicats peuvent être satisfaits, ou associez le filtrage à takeWhile pour garantir la terminaison.

Vérification rapide

Vérifiez votre compréhension de la consommation paresseuse.

Récapitulatif

take, takeWhile, drop, filter et map restent paresseux et se fusionnent élément par élément ; find, exists et headOption s’arrêtent tôt ; les opérations terminales comme toList et sum forcent le résultat.

Protégez-vous contre les filtres impossibles à satisfaire sur les flux infinis. Vous pouvez désormais générer et consommer des séquences paresseuses en toute confiance.

Gratuit pour commencer

Apprends Scala avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
39
Leçons
143

Questions Fréquemment Posées

La leçon « Prendre et filtrer paresseusement » est-elle gratuite ?

Oui — le texte complet de « Prendre et filtrer paresseusement » 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 « Prendre et filtrer paresseusement » ?

Extrayez une portion de flux infinis. 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 4 sur 4.

Combien de temps prend la leçon « Prendre et filtrer paresseusement » ?

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