Introducció

En Dart, un iterable és una col·lecció d'elements que es poden recórrer un per un. Els iterables són fonamentals per treballar amb col·leccions de dades, ja que permeten accedir i manipular elements de manera seqüencial. En aquest tema, aprendrem què són els iterables, com utilitzar-los i com crear els nostres propis iterables personalitzats.

Conceptes Clau

  • Iterable: Una col·lecció que es pot recórrer.
  • Iterator: Un objecte que permet recórrer els elements d'un iterable.
  • for-in loop: Una estructura de control que permet recórrer iterables de manera senzilla.

Utilització d'Iterables

Iterables Predefinits

Dart proporciona diverses col·leccions que implementen la interfície Iterable, com ara List, Set i Map. Aquests iterables es poden recórrer utilitzant un bucle for-in.

void main() {
  List<int> numbers = [1, 2, 3, 4, 5];
  
  for (int number in numbers) {
    print(number);
  }
}

La Interfície Iterable

La interfície Iterable defineix un mètode iterator que retorna un objecte de tipus Iterator. Aquest objecte té dos mètodes principals:

  • moveNext(): Mou el cursor al següent element i retorna true si hi ha un element disponible.
  • current: Retorna l'element actual.
void main() {
  List<int> numbers = [1, 2, 3, 4, 5];
  Iterator<int> iterator = numbers.iterator;
  
  while (iterator.moveNext()) {
    print(iterator.current);
  }
}

Creació d'Iterables Personalitzats

Podem crear els nostres propis iterables implementant la interfície Iterable i proporcionant un Iterator personalitzat.

Exemple: Iterable Personalitzat

class RangeIterable implements Iterable<int> {
  final int start;
  final int end;

  RangeIterable(this.start, this.end);

  @override
  Iterator<int> get iterator => RangeIterator(start, end);
}

class RangeIterator implements Iterator<int> {
  int current;
  final int end;
  bool _firstMove = true;

  RangeIterator(int start, this.end) : current = start - 1;

  @override
  bool moveNext() {
    if (_firstMove) {
      _firstMove = false;
      current++;
    } else {
      current++;
    }
    return current < end;
  }
}

void main() {
  RangeIterable range = RangeIterable(1, 5);
  
  for (int number in range) {
    print(number);
  }
}

Explicació del Codi

  1. RangeIterable: Implementa la interfície Iterable i defineix els límits de l'interval (start i end).
  2. RangeIterator: Implementa la interfície Iterator i gestiona el recorregut dels elements dins de l'interval.
  3. moveNext(): Mou el cursor al següent element i retorna true si hi ha més elements dins de l'interval.
  4. current: Retorna l'element actual.

Exercicis Pràctics

Exercici 1: Recórrer una Llista

Escriu un programa que recorri una llista de noms i imprimeixi cada nom en una línia nova.

void main() {
  List<String> names = ['Anna', 'Bernat', 'Carla', 'David'];
  
  // Solució
  for (String name in names) {
    print(name);
  }
}

Exercici 2: Crear un Iterable Personalitzat

Crea un iterable personalitzat que generi els nombres parells dins d'un interval donat.

class EvenNumbersIterable implements Iterable<int> {
  final int start;
  final int end;

  EvenNumbersIterable(this.start, this.end);

  @override
  Iterator<int> get iterator => EvenNumbersIterator(start, end);
}

class EvenNumbersIterator implements Iterator<int> {
  int current;
  final int end;
  bool _firstMove = true;

  EvenNumbersIterator(int start, this.end) : current = start - 2;

  @override
  bool moveNext() {
    if (_firstMove) {
      _firstMove = false;
      current += 2;
    } else {
      current += 2;
    }
    return current < end;
  }
}

void main() {
  EvenNumbersIterable evens = EvenNumbersIterable(0, 10);
  
  for (int number in evens) {
    print(number);
  }
}

Resum

En aquest tema, hem après què són els iterables i com utilitzar-los en Dart. Hem vist com recórrer col·leccions predefinides com List i Set, i hem après a crear els nostres propis iterables personalitzats. Els iterables són una eina poderosa per treballar amb col·leccions de dades de manera eficient i flexible. En el proper mòdul, explorarem la programació orientada a objectes en Dart.

© Copyright 2024. Tots els drets reservats