Dart List exposes a small set of methods that chain cleanly: where(test) filters by a predicate and returns a lazy Iterable, map(fn) transforms each element and also returns a lazy Iterable, and toList() collects an Iterable back into a fresh List. join(sep) then turns the elements into a single String with sep between them. The original list is never mutated.

Program

Play the program to filter for even numbers, double each, and join the result with +.

list_methods.dart
Replay: real traced execution (multi-file project)
void main() {
  var nums = [1, 2, 3, 4, 5];
  var evens = nums.where((n) => n.isEven).toList();
  var doubled = evens.map((n) => n * 2).toList();
  var summary = doubled.join('+');
  print('evens=$evens doubled=$doubled total=$summary');
}
  1. nums ← [1, 2, 3, 4, 5]

    1void main() {2  var nums = [1, 2, 3, 4, 5];3  var evens = nums.where((n) => n.isEven).toList();
    values this step[1, 2, 3, 4, 5]nums
  2. evens ← [2, 4]

    2var nums = [1, 2, 3, 4, 5];3var evens = nums.where((n) => n.isEven).toList();4var doubled = evens.map((n) => n * 2).toList();
    values this step[2, 4]evens[1, 2, 3, 4, 5]nums
  3. doubled ← [4, 8]

    3var evens = nums.where((n) => n.isEven).toList();4var doubled = evens.map((n) => n * 2).toList();5var summary = doubled.join('+');
    values this step[4, 8]doubled[2, 4]evens
  4. summary ← 4+8

    4var doubled = evens.map((n) => n * 2).toList();5var summary = doubled.join('+');6print('evens=$evens doubled=$doubled total=$summary');
    values this step4+8summary[4, 8]doubled
  5. print('evens=$evens doubled=$doubled total=$summary');

    5  var summary = doubled.join('+');6  print('evens=$evens doubled=$doubled total=$summary');7}
    outputevens=[2, 4] doubled=[4, 8] total=4+8
    values this step[2, 4]evens[4, 8]doubled4+8summary

Filter, Double, Join

  1. Start with nums: [1, 2, 3, 4, 5].
  2. where keeps only even numbers.
  3. map doubles each kept number.
  4. join('+') turns the doubled list into text. | Stage | Values | | --- | --- | | start | [1, 2, 3, 4, 5] | | after where | [2, 4] | | after map | [4, 8] | | after join | 4+8 |
where `list.where(test)` returns a lazy `Iterable` of every element where `test(e)` is `true`. `toList()` materializes it into a fresh `List`.
map `iterable.map(fn)` returns a lazy `Iterable` of `fn(e)` for each element. The element type can change; here `int` stays `int`.
join `list.join(sep)` returns a single `String` with `sep` between successive elements. The list itself is not modified.

Exercise: list_methods.dart

Filter a list to even numbers, double them with map, and join the result with plus signs