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
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');
}
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.