Collections
8.1 Lists
var numbers = [3, 1, 4, 1, 5]; // List<int>
var empty = <String>[];
var fixed = List<int>.filled(5, 0); // fixed-length
var generated = List.generate(5, (i) => i * i); // [0, 1, 4, 9, 16]
const frozen = [1, 2, 3]; // compile-time constant (immutable)
final unmodifiable = List.unmodifiable(numbers);
numbers.add(9);
numbers.addAll([2, 6]);
numbers.insert(0, 0);
numbers.remove(1); // first occurrence
numbers.removeAt(0);
numbers.removeWhere((n) => n > 5);
numbers.sort(); // in place
numbers.sort((a, b) => b.compareTo(a)); // descending
print((numbers.length, numbers.first, numbers.last, numbers.isEmpty));
print((numbers.contains(4), numbers.indexOf(4), numbers.sublist(1, 3)));
print((numbers.reversed.toList(), numbers.join(', ')));
numbers.shuffle();
numbers.clear();8.2 Sets
var colors = {'red', 'green', 'blue'}; // Set<String>
var emptySet = <int>{}; // note: {} alone is an empty Map
colors.add('red'); // ignored (unique)
colors.remove('green');
var a = {1, 2, 3}, b = {3, 4};
print((a.union(b), a.intersection(b), a.difference(b), a.containsAll({1, 2})));8.3 Maps
var ages = {'Ana': 30, 'Bo': 25}; // Map<String, int>
var empty = <String, int>{};
ages['Cy'] = 40;
ages.putIfAbsent('Dee', () => 22);
ages.update('Ana', (v) => v + 1, ifAbsent: () => 0);
print((ages['Ana'], ages['Zed'])); // (31, null) (the lookup returns V?)
print((ages.containsKey('Bo'), ages.keys, ages.values, ages.length));
ages.remove('Bo');
ages.forEach((name, age) => print('$name: $age'));
for (final entry in ages.entries) print('${entry.key} -> ${entry.value}');
final adults = Map.fromEntries(ages.entries.where((e) => e.value >= 18));
final doubled = ages.map((k, v) => MapEntry(k, v * 2));
final counts = <String, int>{};
for (final w in 'a b a c a'.split(' ')) {
counts[w] = (counts[w] ?? 0) + 1; // or: counts.update(w, (c) => c + 1, ifAbsent: () => 1);
}8.4 Collection if, for, Spread and Null-Aware Elements
var isAdmin = true;
var nav = [
'Home',
'Profile',
if (isAdmin) 'Admin',
for (var i = 1; i <= 3; i++) 'Page $i',
...['Help', 'About'],
];
var squares = {for (var i in [1, 2, 3]) i: i * i}; // {1: 1, 2: 4, 3: 9}
String? optionalTag;
var tags = ['dart', ?optionalTag]; // null-aware element (Dart 3.8)8.5 dart:collection
Queue, ListQueue, DoubleLinkedQueue, LinkedHashMap (the default Map, insertion-ordered), HashMap (unordered), SplayTreeMap/SplayTreeSet (sorted), LinkedHashSet, UnmodifiableListView, MapView.
The collection package adds groupBy, firstWhereOrNull, sortedBy, ListEquality, DeepCollectionEquality, PriorityQueue, IterableExtension (.sum, .average, .mapIndexed, .slices).