Iterable et Iterator
Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy. Leçon 68 sur 110.
Chaque fois que vous utilisez une boucle for-in sur une List, un Set ou une autre collection, vous travaillez en réalité avec Iterable et Iterator. Comprendre ces concepts vous permet de créer vos propres classes sur lesquelles il est possible d’itérer.
Un Iterable est tout objet capable de produire une séquence de valeurs. Il a une exigence essentielle : un accesseur iterator qui renvoie un Iterator. L’Iterator est ce qui parcourt réellement les éléments un par un :
var numbers = [1, 2, 3];
var iterator = numbers.iterator;
while (iterator.moveNext()) {
print(iterator.current); // 1, puis 2, puis 3
}La méthode moveNext() passe à l'élément suivant et retourne true s'il y en a un, ou false lorsqu'elle a terminé. La propriété current vous donne l'élément actuel.
Pour rendre votre propre classe itérable, implémentez l'interface Iterable :
class Countdown extends Iterable<int> {
final int start;
Countdown(this.start);
@override
Iterator<int> get iterator => CountdownIterator(start);
}
class CountdownIterator implements Iterator<int> {
int _current;
CountdownIterator(int start) : _current = start + 1;
@override
int get current => _current;
@override
bool moveNext() {
if (_current > 0) {
_current--;
return true;
}
return false;
}
}
void main() {
for (var n in Countdown(3)) {
print(n); // 3, 2, 1, 0
}
}Désormais, Countdown fonctionne avec les boucles for-in et toutes les méthodes Iterable telles que map, where et fold. Ce modèle est essentiel lors de la création de collections personnalisées qui s'intègrent parfaitement à l'écosystème de collections de Dart.
Défi
FacileConstruisons un générateur de plages personnalisé qui peut être parcouru à l'aide d'une boucle for-in ! Vous allez créer vos propres classes Iterable et Iterator pour générer une séquence de nombres dans une plage spécifiée.
Vous allez organiser votre code en deux fichiers :
range.dart: créez deux classes qui fonctionnent ensemble pour produire une séquence de nombres :- Une classe
RangeIteratorqui implémenteIterator<int>. Elle doit suivre la position actuelle et savoir quand s'arrêter. L'itérateur commence avant le premier élément, doncmoveNext()doit être appelé avant d'accéder àcurrent. - Une classe
Rangequi étendIterable<int>. Elle prend une valeurstartet une valeurenddans son constructeur et fournit un accesseuriteratorqui renvoie unRangeIterator.
startetend. Par exemple,Range(1, 5)doit produire : 1, 2, 3, 4, 5.- Une classe
main.dart: importez votre fichier de plage et présentez votre itérable personnalisé :- Créez un
Range(1, 5)et utilisez une bouclefor-inpour afficher chaque nombre sur sa propre ligne - Affichez une ligne vide
- Créez un
Range(10, 13)et utilisez la méthodemappour doubler chaque valeur, puis affichez la liste obtenue
- Créez un
Comme votre classe Range étend Iterable, elle accède automatiquement à toutes les puissantes méthodes de collection comme map, where et fold — c'est tout l'intérêt d'implémenter l'interface Iterable !
Résultat attendu :
1
2
3
4
5
[20, 22, 24, 26]Essayez vous-même
import 'range.dart';
void main() {
// TODO : Créer un Range(1, 5) et utiliser une boucle for-in pour afficher chaque nombre
// TODO : Afficher une ligne vide
// TODO : Créer un Range(10, 13), utiliser map pour doubler chaque valeur et afficher la liste
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesBibliothèques et importsIntroduction à la POOClasses vs objetsLe mot-clé thisMéthodesVariables d’instanceBases des constructeursRécapitulatif - Calculatrice simple4Sécurité face aux valeurs nulles
Introduction à la sécurité face aux valeurs nullesNullable vs Non-NullableLes opérateurs ? et !Mot-clé Late et sécurité face aux valeurs nullesOpérateurs sensibles à nullSécurité face aux valeurs nulles dans les classesRécapitulatif – Système de profil utilisateur7Classes abstraites et interfaces
Classes abstraitesMéthodes abstraitesInterfaces en DartInterfaces implicitesImplémenter ou étendreInterfaces multiplesRécapitulatif - Calculateur de formes10Collections et génériques
Vue d’ensemble des List, Set et MapCollections à typage sûrClasses génériquesMéthodes génériquesContraintes génériquesIterable et IteratorRécapitulatif – stockage générique2Constructeurs en Dart
Constructeur par défautConstructeurs nommésListes d'initialisationConstructeurs constantsConstructeurs factoryConstructeurs redirigésRécapitulatif - Constructeur de formes5Encapsulation
Membres publics vs privésLa convention du préfixe _Confidentialité au niveau de la bibliothèqueApprofondissement des getters et settersMasquage de l’informationRécapitulatif - Fiches des étudiants8Mixins
Introduction aux MixinsCréer des MixinsUtiliser plusieurs MixinsMot-clé on dans les MixinsMixin ou héritageMixin ou interfaceRécapitulatif - Système animal11Méthodes spéciales
Redéfinition de toString()Redéfinition de hashCode et ==Interface ComparableMéthode call()Redéfinition de noSuchMethodRécapitulatif - Collection personnalisée14Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron Strategy3Propriétés des classes
Membres d’instance et statiquesChamps Final et ConstVariables différéesMéthodes et champs statiquesAccesseurs et mutateursRécapitulatif - Gestionnaire de compte bancaire6Héritage
Héritage de baseLe mot-clé superRedéfinition de méthodeL’annotation @overrideLe mot-clé de classe finalConstructeurs et héritageRécapitulatif – Hiérarchie des employés9Polymorphisme
Bases du polymorphismePolymorphisme via les interfacesVérification des types à l’exécutionLes opérateurs is et asMot-clé covariantRécapitulatif - Processeur de paiements12POO asynchrone
Futures et async/awaitNotions de base des StreamsContrôleurs de StreamsConstructeurs asynchronesAsynchrone dans les méthodes de classeRécapitulatif - récupérateur de données15Patrons de conception – Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron CompositePatron DépôtEntraînez-vous par vous-même : Compilateur Dart en ligne