Colecciones
## Objetivos de Aprendizaje
- Trabajar con Listas, Conjuntos y Mapas
- Dominar metodos de colecciones
- Usar condicionales y propagacion en colecciones
- Filtrar y transformar colecciones
## Listas
### Creando Listas
```dart
void main() {
// Lista vacia
var empty = [];
// Con valores iniciales
var numbers = [1, 2, 3, 4, 5];
// Lista de longitud fija
var fixed = List.filled(3, 0);
// Lista expandible
var growable = List.empty(growable: true);
growable.add(1);
growable.add(2);
}
```
### Accediendo a Elementos
```dart
void main() {
var list = ['apple', 'banana', 'orange'];
print(list[0]); // apple
print(list.first); // apple
print(list.last); // orange
print(list.length); // 3
// Indice negativo
print(list[-1]); // Error: invalido
}
```
### Modificando Listas
```dart
void main() {
var list = [1, 2, 3];
list.add(4); // [1, 2, 3, 4]
list.addAll([5, 6]); // [1, 2, 3, 4, 5, 6]
list.insert(0, 0); // [0, 1, 2, 3, 4, 5, 6]
list.remove(3); // elimina el primer 3
list.removeAt(0); // elimina el primer elemento
list.clear(); // []
}
```
### Metodos de Lista
```dart
void main() {
var list = [3, 1, 4, 1, 5, 9, 2, 6];
// Ordenar
var sorted = List.from(list)..sort();
print(sorted); // [1, 1, 2, 3, 4, 5, 6, 9]
// Invertir
print(list.reversed.toList()); // [6, 2, 9, 5, 1, 4, 1, 3]
// Buscar
print(list.indexOf(4)); // 2
print(list.lastIndexOf(1)); // 3
print(list.contains(5)); // true
// Rebanar
print(list.sublist(2, 5)); // [4, 1, 5]
}
```
## Conjuntos
### Creando Conjuntos
```dart
void main() {
// Conjunto vacio
var empty = {};
// Con valores
var fruits = {'apple', 'banana', 'orange'};
// De lista (duplicados removidos)
var unique = {1, 2, 3, 3, 3}; // {1, 2, 3}
}
```
### Operaciones de Conjunto
```dart
void main() {
var a = {1, 2, 3, 4};
var b = {3, 4, 5, 6};
// Union
print(a.union(b)); // {1, 2, 3, 4, 5, 6}
// Interseccion
print(a.intersection(b)); // {3, 4}
// Diferencia
print(a.difference(b)); // {1, 2}
// Contiene
print(a.contains(3)); // true
print(a.containsAll(b)); // false
}
```
### Modificando Conjuntos
```dart
void main() {
var set = {1, 2, 3};
set.add(4); // {1, 2, 3, 4}
set.addAll([5, 6]); // {1, 2, 3, 4, 5, 6}
set.remove(2); // {1, 3, 4, 5, 6}
set.removeAll({5, 6}); // {1, 3, 4}
set.clear(); // {}
}
```
## Mapas
### Creando Mapas
```dart
void main() {
// Mapa vacio
var empty = {};
// Con valores
var ages = {'Alice': 30, 'Bob': 25};
// Usando constructor Map
var map = Map();
map['name'] = 'Alice';
map['active'] = true;
}
```
### Accediendo a Mapas
```dart
void main() {
var ages = {'Alice': 30, 'Bob': 25};
print(ages['Alice']); // 30
print(ages['unknown']); // null
// Con valor por defecto
print(ages['unknown'] ?? 0); // 0
// Claves y valores
print(ages.keys); // (Alice, Bob)
print(ages.values); // (30, 25)
print(ages.length); // 2
}
```
### Modificando Mapas
```dart
void main() {
var map = {};
map['a'] = 1; // {a: 1}
map.addAll({'b': 2, 'c': 3}); // {a: 1, b: 2, c: 3}
map.remove('b'); // {a: 1, c: 3}
map.clear(); // {}
}
```
### Metodos de Mapa
```dart
void main() {
var ages = {'Alice': 30, 'Bob': 25, 'Charlie': 35};
// Contiene
print(ages.containsKey('Alice')); // true
print(ages.containsValue(30)); // true
// Iterar
for (var entry in ages.entries) {
print('${entry.key}: ${entry.value}');
}
// Transformacion de mapa
var names = ages.keys.where((k) => k.startsWith('C')).toList();
print(names); // [Charlie]
var doubled = ages.map((k, v) => MapEntry(k, v * 2));
print(doubled); // {Alice: 60, Bob: 50, Charlie: 70}
}
```
## Condicionales en Colecciones
### Elementos If
```dart
void main() {
var needsLogin = true;
var widgets = [
Text('Titulo'),
if (needsLogin) Text('Login'),
Text('Pie de pagina'),
];
}
```
### Elementos If-Else
```dart
void main() {
var isPremium = false;
var items = [
Text('Item 1'),
if (isPremium)
Text('Caracteristica Premium')
else
Text('Caracteristica Basica'),
];
}
```
## Propagacion en Colecciones
### Operador de Propagacion
```dart
void main() {
var a = [1, 2, 3];
var b = [0, ...a, 4]; // [0, 1, 2, 3, 4]
// Propagacion nula
List? nullable;
var c = [0, ...?nullable, 4]; // [0, 4]
}
```
### Propagacion con Mapas
```dart
void main() {
var defaults = {'a': 1, 'b': 2};
var overrides = {'b': 3, 'c': 4};
var combined = {...defaults, ...overrides};
print(combined); // {a: 1, b: 3, c: 4}
}
```
## For en Colecciones
```dart
void main() {
var items = ['a', 'b', 'c'];
var widgets = [
for (var item in items) Text(item),
];
// Equivalente a:
// var widgets = items.map((item) => Text(item)).toList();
}
```
### Con Indice
```dart
void main() {
var items = ['a', 'b', 'c'];
var numbered = [
for (var i = 0; i < items.length; i++)
'${i + 1}: ${items[i]}',
];
print(numbered); // [1: a, 2: b, 3: c]
}
```
## Metodos de Colecciones
### forEach
```dart
void main() {
[1, 2, 3].forEach((n) => print(n));
}
```
### map
```dart
void main() {
var doubled = [1, 2, 3].map((n) => n * 2).toList();
print(doubled); // [2, 4, 6]
}
```
### where
```dart
void main() {
var evens = [1, 2, 3, 4, 5].where((n) => n % 2 == 0).toList();
print(evens); // [2, 4]
}
```
### reduce y fold
```dart
void main() {
// reduce - acumula a un solo valor
var sum = [1, 2, 3, 4].reduce((a, b) => a + b);
print(sum); // 10
// fold - con valor inicial
var product = [1, 2, 3, 4].fold(1, (a, b) => a * b);
print(product); // 24
}
```
### any y every
```dart
void main() {
var list = [1, 2, 3, 4, 5];
// any - al menos uno coincide
print(list.any((n) => n > 4)); // true
// every - todos coinciden
print(list.every((n) => n > 0)); // true
}
```
### firstWhere y singleWhere
```dart
void main() {
var list = [1, 2, 3, 4, 5];
// firstWhere - primer elemento que coincide
print(list.firstWhere((n) => n > 2)); // 3
// singleWhere - unico elemento que coincide
var singles = [3].singleWhere((n) => n > 2);
print(singles); // 3
}
```
## Resumen
- List: ordenada, acceso por indice, permite duplicados
- Set: desordenada, elementos unicos
- Map: pares clave-valor
- Coleccion if/for: condicionales y bucles en linea
- Propagacion: `...` y `...?` para composicion de colecciones
- Metodos comunes: map, where, reduce, fold, forEach, any, every
Comments
Comments powered by Giscus
To enable comments, add your Giscus embed code here.
Learn more about Giscus →