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).