Collections

Dart lists, sets, maps, and iterables — creating, iterating, and transforming

Dart provides three main collection types: List, Set, and Map. All implement Iterable (directly or via .entries/.values) and share a rich set of functional operators.

List

Ordered, indexed collection. Allows duplicates.

// Creating
var list = [1, 2, 3];                           // List<int>
var growable = <int>[];                          // empty growable list
var fixed = List.filled(5, 0);                   // [0, 0, 0, 0, 0] — fixed length
var generate = List.generate(5, (i) => i * 2);   // [0, 2, 4, 6, 8]

// Spread operators
var a = [1, 2];
var b = [0, ...a, 3];                            // [0, 1, 2, 3]
List<int>? maybeNull;
var c = [0, ...?maybeNull, 3];                   // null-aware spread

// Collection if/for
var active = true;
var items = [1, if (active) 2, 3];               // [1, 2, 3]
var squares = [for (var i = 0; i < 3; i++) i * i]; // [0, 1, 4]

// Access
list[0];                    // 1
list.first;                  // 1
list.last;                   // 3
list.length;                 // 3
list.indexOf(2);            // 1
list.lastIndexOf(2);        // 1

// Add / remove (growable only)
list.add(4);                // [1, 2, 3, 4]
list.addAll([5, 6]);       // [1, 2, 3, 4, 5, 6]
list.insert(1, 99);         // insert at index 1
list.remove(3);             // removes first occurrence of 3
list.removeAt(0);           // removes element at index 0
list.removeLast();           // removes last element
list.removeRange(0, 2);     // removes range

// Transform
list.map((e) => e * 2);                   // [2, 4, 6]
list.where((e) => e > 1);                  // [2, 3]
list.expand((e) => [e, e]);                // [1, 1, 2, 2, 3, 3]
list.cast<num>();                          // List<num> — cast elements

// Sort
list.sort();                                // in-place sort
list.sort((a, b) => b.compareTo(a));        // descending
var sorted = [...list]..sort();              // sorted copy

// Find
list.firstWhere((e) => e > 1, orElse: () => -1);
list.lastWhere((e) => e > 1, orElse: () => -1);
list.indexWhere((e) => e > 1);
list.any((e) => e > 2);                    // true
list.every((e) => e > 0);                   // true

// Reduce / fold
list.reduce((a, b) => a + b);               // 6
list.fold<int>(0, (acc, e) => acc + e);    // 6

// Group by (since Dart 3)
var grouped = list.groupFoldBy<int, List<int>>(
  (e) => e % 2,
  (list, e) => list..add(e),
);
// {1: [1, 3], 0: [2]}

// Join to string
list.join(', ');                              // '1, 2, 3'

// Sublist
list.sublist(1, 3);                          // [2, 3]
list.getRange(1, 3);                          // Iterable(2, 3)

// Unique
var unique = list.toSet().toList();

Set

Unordered collection of unique elements.

// Creating
var set = {1, 2, 3};                          // Set<int>
var emptySet = <int>{};                        // empty Set
var fromList = {1, 2, 2, 3};                   // {1, 2, 3} — duplicates removed

// Add / remove
set.add(4);                                    // {1, 2, 3, 4}
set.addAll([5, 6]);                            // {1, 2, 3, 4, 5, 6}
set.remove(1);                                 // {2, 3, 4, 5, 6}

// Check membership
set.contains(2);                               // true

// Set operations
var a = {1, 2, 3};
var b = {2, 3, 4};

a.union(b);                                    // {1, 2, 3, 4}
a.intersection(b);                             // {2, 3}
a.difference(b);                               // {1}

Map

Key-value pairs. Keys are unique.

// Creating
var map = {'a': 1, 'b': 2, 'c': 3};          // Map<String, int>
var mutable = <String, int>{};                  // empty mutable map
var empty = Map<String, int>();                 // empty map

// Access
map['a'];                                       // 1 — null if missing
map['z'] ?? 0;                                  // 0 — default value

// Add / update
mutable['x'] = 10;                              // add or update
mutable.addAll({'y': 20, 'z': 30});            // add all
mutable.update('x', (v) => v * 2);             // update existing
mutable.putIfAbsent('w', () => 40);             // add only if missing
mutable.updateAll((key, value) => value * 2);   // update all values

// Remove
mutable.remove('w');                             // removes key, returns value or null
mutable.removeWhere((key, value) => value < 10);

// Iterate
for (var key in map.keys) {
  print(key);
}

for (var value in map.values) {
  print(value);
}

map.forEach((key, value) {
  print('$key = $value');
});

// Properties
map.keys;           // Iterable of keys
map.values;         // Iterable of values
map.entries;        // Iterable of MapEntry
map.length;         // number of entries
map.isEmpty;         // true if no entries
map.isNotEmpty;      // true if has entries
map.containsKey('a'); // true
map.containsValue(1); // true

// Transform
map.map((key, value) => MapEntry(key.toUpperCase(), value * 2));

// Filter entries
map.entries.where((e) => e.value > 1).toList();

// From lists
var keys = ['a', 'b', 'c'];
var values = [1, 2, 3];
var combined = Map.fromIterables(keys, values);

Iterable methods (shared)

All collections implement Iterable and share these methods:

// Functional operations
iterable.map((e) => e.transform);
iterable.where((e) => condition);
iterable.expand((e) => moreElements);
iterable.take(5);                   // first 5 elements
iterable.skip(3);                   // skip first 3
iterable.first;                      // first element (throws if empty)
iterable.last;                       // last element (throws if empty)
iterable.single;                     // single element (throws if 0 or 2+)
iterable.firstOrNull;               // first or null (Dart 3)
iterable.lastOrNull;                 // last or null (Dart 3)
iterable.singleOrNull;              // single or null (Dart 3)
iterable.any((e) => condition);
iterable.every((e) => condition);
iterable.forEach((e) => action);
iterable.reduce((a, b) => combined);
iterable.fold<int>(0, (acc, e) => acc + e);
iterable.toList();
iterable.toSet();