Functions

9.1 Defining Functions

int add(int a, int b) {
  return a + b;
}

int multiply(int a, int b) => a * b;          // arrow syntax for single expressions

void log(String message) => print('[LOG] $message');

bool isEven(int n) => n % 2 == 0;

9.2 Parameters

// Optional positional parameters: [ ]
String greet(String name, [String greeting = 'Hello', String? suffix]) =>
    '$greeting, $name${suffix ?? ''}';
greet('Ana');
greet('Ana', 'Hi', '!');

// Named parameters: { } (optional by default; use `required` or defaults)
void createUser({required String name, int age = 18, String? email}) {}
createUser(name: 'Bo', email: 'bo@x.com');

// Named arguments can appear anywhere in the argument list (Dart 2.17+)
void connect(String host, {int port = 80}) {}
connect(port: 8080, 'localhost');

9.3 First-Class Functions, Closures and Tear-offs

int square(int x) => x * x;
int Function(int) op = square;                  // function type
var fn = (int x) => x + 1;                      // anonymous function (lambda)
[1, 2, 3].map(square);                          // tear-off: pass the function itself
['a', 'b'].forEach(print);
var parse = int.parse;                          // static method tear-off
var toUpper = 'x'.toUpperCase;                  // instance method tear-off
var makeList = List<int>.empty;                 // constructor tear-off (Dart 2.15)

Function makeCounter() {
  var count = 0;
  return () => ++count;                         // closure captures count
}
final counter = makeCounter();
counter(); counter();                           // 1, 2

int Function(int) makeMultiplier(int factor) => (x) => x * factor;
final triple = makeMultiplier(3);
print(triple(5));                                // 15

9.4 Typedefs

typedef Predicate<T> = bool Function(T value);
typedef Json = Map<String, dynamic>;             // type alias for any type (Dart 2.13+)
typedef IntList = List<int>;

List<T> filter<T>(List<T> items, Predicate<T> test) => [for (final i in items) if (test(i)) i];
filter([1, 2, 3, 4], (n) => n.isEven);

9.5 The main Function and Return Types

void main(), void main(List<String> args), or Future<void> main() async.

Functions without a return statement return null. Declare the return type void (or Never for always-throwing functions).