Collections Dart

I. Les trois collections natives de Dart

Dart intègre nativement trois types de collections : List, Set et Map ;

La contrainte de type des éléments de la collection se configure grâce auxGénériques (Generics).

Type de collectionCaractéristiques principalesIdentifiant littéral
ListOrdonnée, autorise les doublons, accès par indice[]
SetSans ordre, éléments uniques, pas d’indices{} (il faut préciser le générique explicitement pour que ce soit un Set)
MapStockage de paires clé-valeur, clés uniques, valeurs dupliquables{clé: valeur}

II. List Liste (tableau ordonné)

1. Définition basique et inférence de type

  • En Dart, les tableaux sont des objets List par nature, créés par le littéral [] ;
  • Le type est inféré automatiquement, exemple : var list = [1,2,3]List<int>, insérer une valeur non entière provoque une erreur ;
  • Prend en charge lavirgule finale, sans impact sur la syntaxe et réduisant les erreurs de copier-coller : var list = ['Car', 'Boat', 'Plane',];

2. Opérations basiques

  1. Règle des indices : commencent à 0, le dernier indice valide est list.length - 1 ;
  2. Lecture / modification d’éléments : list[index], list[index] = nouvelleValeur ;
  3. Récupérer la longueur : propriété .length ;

Exemple

void main() {
	var list = [1,2,3];
	print(list.length);//Affiche le nombre d'éléments : 3
	print(list[1]);// Affiche 2
	list[1] = 9; //Modifie le second élément en 9
	print(list[1]);//Affiche la valeur modifiée : 9
}Langage du code : Dart (dart)

3. Liste constante (immuable à la compilation)

Ajoutez le mot-clé const devant le littéral : impossible d’ajouter, supprimer ou modifier des éléments à l’exécution :

void main() {
	var constantList = const [1,2,3];
	constantList[1] = 100; // Erreur de compilation
}Langage du code : Dart (dart)
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
Unhandled exception:
Unsupported operation: Cannot modify an unmodifiable list
#0      UnmodifiableListMixin.[]= (dart:_internal/list.dart:89:5)
#1      main (file:///D:/dartdemo/firstdart/bin/firstdart.dart:4:14)
#2      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:314:19)
#3      _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:193:12)Langage du code : PHP (php)

III. Set Ensemble

Éléments sans ordre et uniques

1. Caractéristiques principales du Set

  • Sans ordre : les éléments n’ont pas d’indice fixe, impossible de lire ou modifier avec [indice]
  • Éléments uniques : suppression automatique des doublons, ajouter des éléments identiques ne cause pas d’erreur mais une seule copie est conservée
  • Identifiant littéral : accolades {}
  • Contrainte générique : limitation à un seul type possible, insertion de types différents provoque une erreur de compilation ou d’exécution

Différencier Set vide et Map vide (point source de confusion)

{} est interprété par défaut comme un Map ; pour créer un Set vide il faut préciser le générique explicitement

void main() {
	// Set vide de String
	var names = <String>{};
	Set<String> names2 = {}; // Écriture équivalente

	// Sans annotation générique, Dart le reconnaît comme Map<dynamic, dynamic>
	var names3 = {};
}Langage du code : Dart (dart)
Inférence de type
void main() {
	// Inféré automatiquement en Set<String>
	var halogens = {'dog', 'cat', 'horse'};

	// Inféré automatiquement en Set<int>
	var nums = {1, 2, 6, 2}; // Le doublon 2 est supprimé, résultat final {1,2,6}

	// Types mélangés, inféré en Set<Object> (déconseillé, perte de vérification de type)
	var mix = {1, "apple"};
}Langage du code : JavaScript (javascript)

Après inférence, insérer un élément de type différent génère une erreur

void main() {
  // Le littéral ne contient que des chaînes, inféré Set<String>
  var animals = {'dog'};
  print(animals.runtimeType); // _CompactLinkedHashSet<String>

  // Ajout de chaînes du même type sans erreur
  animals.add('cat');
  animals.add('pig');
  print(animals); // {dog, cat, pig}
  
  // Erreur : la méthode add attend une String mais reçoit un int
  animals.add(1); 
}Langage du code : Dart (dart)

2. Ajout, suppression et longueur

  • Ajouter un seul élément : .add();
  • Ajouter plusieurs éléments en bloc : .addAll();
  • Récupérer le nombre total d’éléments : .length;
var elements = <String>{};
elements.add('fluorine');
elements.addAll({'chlorine', 'bromine'});
print(elements.length); //3Langage du code : PHP (php)

3. Set constant

Ajoutez const devant le littéral : ajout et suppression d’éléments interdits :

final constantSet = const {'fluorine', 'chlorine'};
// constantSet.add('helium'); // Génère une erreurLangage du code : PHP (php)

IV. Map Table de correspondance (paires clé-valeur)

1. Caractéristiques basiques
  • Stockage de données sous forme de paires Clé-Valeur;
  • La clé est unique dans tout le Map, les valeurs peuvent être dupliquées;
  • Clé et valeur acceptent n’importe quel type d’objet;
  • Format littéral {clé: valeur};
  • Inférence automatique de type :
void main() {
	var gifts = {'first': 'partridge'}; // Inféré automatiquement Map<String, String> 
	
	var nobleGases = {2: 'helium'}; // Inféré automatiquement Map<int, String>
}Langage du code : Dart (dart)
2. Deux modes de création
  • Création par littéral
var gifts = {'first': 'partridge'};  Langage du code : Dart (dart)
  • Création par constructeur Map (le mot-clé new est omissible)
// Écriture constructeur
var gifts = Map<String, String>();
gifts['first'] = 'partridge';Langage du code : JavaScript (javascript)
3. Ajout, consultation et longueur
  1. Ajouter / écraser une paire clé-valeur : map[clé] = valeur;
  2. Récupérer une valeur par clé : map[clé]; renvoie null si la clé n’existe pas;
  3. Récupérer le nombre total de paires clé-valeur : .length;
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // Nouvel ajout
print(gifts['first']); //Consultation de valeur
print(gifts['fifth']);//Consultation de clé inexistante
print(gifts.length); //Récupération de la longueur Langage du code : PHP (php)
4. Map constant

Ajoutez const devant le littéral : les paires clé-valeur ne peuvent pas être modifiées :

final constantMap = const {2: 'helium', 10: 'neon'};
// constantMap[2] = 'Helium'; // Génère une erreurLangage du code : Dart (dart)

V. Éléments étendus dans les littéraux de collection

Les littéraux de collection prennent en charge plusieurs syntaxes spéciales, divisées en deux catégories : éléments basiques et éléments de flux de contrôle, afin de simplifier la construction des collections.

  1. Éléments basiques : expressions simples, paires clé-valeur, éléments sécurisés contre null
  2. Éléments de flux de contrôle : opérateur spread, condition if, boucle for, combinaisons imbriquées

1. Éléments d’expression simple

Écriture la plus basique : écrivez directement une expression, son résultat est inséré dans la collection. Dans l’exemple ci-dessous le second élément est le résultat du calcul 2 * 3, le résultat final est [1, 6, text]

void main() {
	var list = [1, 2 * 3, 'text'];
	print(list); //[1, 6, text]
}Langage du code : PHP (php)

2. Éléments clé-valeur

Uniquement pour les littéraux Map, format expressionClé : expressionValeur. Dans l’exemple suivant la clé et la valeur du premier élément sont toutes deux calculées par des expressions.

void main() {
	var map = {1+1: 3*8, 'name': 'apple'};
	print(map); //{2: 24, name: apple}
}Langage du code : Dart (dart)

3. Éléments sécurisés contre null (Dart ≥3.8)

Syntaxe ?expression : l’élément n’est inséré dans la collection que si l’expression n’est pas null ; si elle vaut null, elle est ignorée totalement

Utilisation dans List : a vaut null donc il n’est pas inséré au final, sans erreur

int? a = null;
int? b = 3;
var items = [1, ?a, ?b, 5]; // [1, 3, 5]Langage du code : JavaScript (javascript)

Utilisation dans Map (le ? s’applique à la clé et à la valeur)

String? k = null;
int? v = null;
var m = {?k: ?v}; // Si clé ou valeur est null, la paire entière est supprimée
Langage du code : JavaScript (javascript)

4. Opérateur Spread (dépliement)

① Dépliement classique ...

Déploie tous les éléments d’une collection itérable pour les insérer ; impossible de déplier une collection null

var a = [1,2,3];
var items = [0, ...a, 4]; // [0,1,2,3,4]Langage du code : JavaScript (javascript)
② Dépliement sécurisé contre null ...?

Compatible avec les collections nullables : si la collection est null elle est ignorée sans erreur ;

Si la collection n’est pas null mais contient des éléments null en interne, ces null sont conservés

List<int>? a = null;
var b = [1, null, 3];
var items = [0, ...?a, ...?b, 4]; // [0, 1, null, 3, 4]Langage du code : PHP (php)

Règle obligatoire : les collections acceptant null doivent utiliser ...?, sinon erreur de compilation.

5. Élément If (conditionnel)

On peut écrire une branche if directement à l’intérieur de la collection, le contenu n’est inséré que si la condition est vraie. Prend en charge les tests booléens, le filtrage if-case et le else

Test booléen basique
void main() {
	bool flag = true;
    var list = [0, if(flag) 1 else 99, 2];
	print(list); //[0, 1, 2]
}Langage du code : Dart (dart)
Correspondance de motif if-case (décomposition de type et tableau)
void main() {
	Object data = 123;
	var info = [
	  if(data case int i) 'Nombre : $i',
	  if(data case String s) 'Texte : $s'
	];
	print(info); //[Nombre : 123]
}Langage du code : Dart (dart)

Comme data est de type int, seul « Nombre : 123 » est inséré, la branche texte est ignorée

6. Élément For (boucle)

Écrivez directement une boucle for dans la collection pour générer plusieurs éléments. Prend en charge for-in et la boucle ternaire classique

var nums = [2,3,4];

// for-in
var list1 = [1, for(var n in nums) n*n, 7]; // [1,4,9,16,7]

// Boucle ternaire
var list2 = [1, for(var x=5; x>2; x--) x, 7]; // [1,5,4,3,7]Langage du code : JavaScript (javascript)

7. Flux de contrôle imbriqué

if, for et opérateur spread peuvent être imbriqués à plusieurs niveaux librement, équivalent aux compréhensions de liste des autres langages

Exemple : ne conserver que les nombres pairs

var numbers = [1,2,3,4,5,6];
var items = [
  0,
  for(var n in numbers)
    if(n.isEven) n,
  8
]; // [0,2,4,6,8]Langage du code : JavaScript (javascript)

Exemple : for imbriqué + if + opérateur spread

void main() {
	var ys = [1,2,3];
	var nest = [
	  ...[
		for(var x=0;x<2;x++)
		  for(var y in ys)
			if(x<y) x+y*10
	  ]
	];
	print(nest); //[10, 20, 30, 21, 31]
}Langage du code : Dart (dart)

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *