Dart函数与闭包 #

一、函数基础 #

1.1 函数定义 #

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

String greet(String name) {
  return 'Hello, $name!';
}

void printMessage(String message) {
  print(message);
}

1.2 箭头函数 #

dart
int add(int a, int b) => a + b;
String greet(String name) => 'Hello, $name!';
void printMessage(String message) => print(message);

1.3 函数类型 #

dart
int Function(int, int) calculator = add;
String Function(String) greeter = greet;

typedef Calculator = int Function(int, int);
Calculator calc = (a, b) => a * b;

二、参数 #

2.1 位置参数 #

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

int sum = add(3, 5);

2.2 可选位置参数 #

dart
String greet(String name, [String? greeting]) {
  return '${greeting ?? 'Hello'}, $name!';
}

print(greet('Alice'));
print(greet('Bob', 'Hi'));

2.3 默认参数值 #

dart
String greet(String name, [String greeting = 'Hello']) {
  return '$greeting, $name!';
}

print(greet('Alice'));
print(greet('Bob', 'Hi'));

2.4 命名参数 #

dart
String createUser({
  required String name,
  int? age,
  String role = 'user',
}) {
  return 'Name: $name, Age: ${age ?? 'unknown'}, Role: $role';
}

print(createUser(name: 'Alice'));
print(createUser(name: 'Bob', age: 25));
print(createUser(name: 'Charlie', age: 30, role: 'admin'));

2.5 必需命名参数 #

dart
void sendEmail({
  required String to,
  required String subject,
  String body = '',
}) {
  print('To: $to');
  print('Subject: $subject');
  print('Body: $body');
}

sendEmail(to: 'user@example.com', subject: 'Hello');

2.6 混合参数 #

dart
String formatMessage(String prefix, {required String message, String suffix = ''}) {
  return '$prefix$message$suffix';
}

print(formatMessage('>> ', message: 'Hello'));
print(formatMessage('>> ', message: 'Hello', suffix: ' <<'));

三、匿名函数 #

3.1 基本语法 #

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

var multiply = (int a, int b) => a * b;

print(add(3, 5));
print(multiply(3, 5));

3.2 作为参数传递 #

dart
void execute(int a, int b, int Function(int, int) operation) {
  print(operation(a, b));
}

execute(3, 5, (a, b) => a + b);
execute(3, 5, (a, b) => a * b);

var numbers = [1, 2, 3, 4, 5];
var doubled = numbers.map((n) => n * 2).toList();
var filtered = numbers.where((n) => n > 2).toList();

3.3 立即执行函数 #

dart
var result = ((int a, int b) {
  return a + b;
})(3, 5);

print(result);

四、闭包 #

4.1 什么是闭包 #

闭包是一个函数对象,它可以访问其词法作用域内的变量,即使函数在其原始作用域之外使用。

dart
Function makeAdder(int addBy) {
  return (int i) => i + addBy;
}

var add2 = makeAdder(2);
var add5 = makeAdder(5);

print(add2(3));
print(add5(3));

4.2 闭包示例 #

dart
Function counter() {
  int count = 0;
  return () {
    count++;
    return count;
  };
}

var increment = counter();
print(increment());
print(increment());
print(increment());

4.3 闭包应用场景 #

计数器:

dart
Function createCounter([int start = 0]) {
  int count = start;
  return () => ++count;
}

var counter = createCounter();
print(counter());
print(counter());

工厂函数:

dart
Function createMultiplier(int factor) {
  return (int value) => value * factor;
}

var double = createMultiplier(2);
var triple = createMultiplier(3);

print(double(5));
print(triple(5));

私有变量:

dart
Function createBankAccount(String owner, double initialBalance) {
  double balance = initialBalance;
  
  return {
    'deposit': (double amount) {
      balance += amount;
      return balance;
    },
    'withdraw': (double amount) {
      if (balance >= amount) {
        balance -= amount;
        return balance;
      }
      throw Exception('Insufficient balance');
    },
    'getBalance': () => balance,
  };
}

五、高阶函数 #

5.1 函数作为参数 #

dart
void processList(List<int> list, int Function(int) processor) {
  for (var item in list) {
    print(processor(item));
  }
}

processList([1, 2, 3], (n) => n * 2);

5.2 函数作为返回值 #

dart
Function getOperation(String op) {
  switch (op) {
    case 'add':
      return (int a, int b) => a + b;
    case 'subtract':
      return (int a, int b) => a - b;
    case 'multiply':
      return (int a, int b) => a * b;
    default:
      return (int a, int b) => 0;
  }
}

var add = getOperation('add');
print(add(3, 5));

5.3 函数组合 #

dart
int Function(int) compose(int Function(int) f, int Function(int) g) {
  return (int x) => f(g(x));
}

int double(int x) => x * 2;
int addOne(int x) => x + 1;

var doubleThenAddOne = compose(addOne, double);
print(doubleThenAddOne(5));

var addOneThenDouble = compose(double, addOne);
print(addOneThenDouble(5));

六、级联调用 #

6.1 方法级联 #

dart
class StringBuilder {
  final StringBuffer _buffer = StringBuffer();
  
  StringBuilder append(String str) {
    _buffer.write(str);
    return this;
  }
  
  StringBuilder appendLine(String str) {
    _buffer.writeln(str);
    return this;
  }
  
  @override
  String toString() => _buffer.toString();
}

var result = StringBuilder()
  .append('Hello')
  .append(' ')
  .append('World')
  .toString();

6.2 级联操作符 #

dart
class Person {
  String? name;
  int? age;
  
  void sayHello() {
    print('Hello, I am $name');
  }
}

var person = Person()
  ..name = 'Alice'
  ..age = 25
  ..sayHello();

七、函数式编程 #

7.1 map #

dart
var numbers = [1, 2, 3, 4, 5];
var doubled = numbers.map((n) => n * 2).toList();
var strings = numbers.map((n) => 'Number: $n').toList();

7.2 where #

dart
var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var evens = numbers.where((n) => n.isEven).toList();
var greaterThan5 = numbers.where((n) => n > 5).toList();

7.3 reduce #

dart
var numbers = [1, 2, 3, 4, 5];
var sum = numbers.reduce((a, b) => a + b);
var product = numbers.reduce((a, b) => a * b);
var max = numbers.reduce((a, b) => a > b ? a : b);

7.4 fold #

dart
var numbers = [1, 2, 3, 4, 5];
var sum = numbers.fold(0, (a, b) => a + b);
var product = numbers.fold(1, (a, b) => a * b);
var concatenated = numbers.fold('', (a, b) => '$a$b');

7.5 every和any #

dart
var numbers = [2, 4, 6, 8, 10];
var allEven = numbers.every((n) => n.isEven);
var hasOdd = numbers.any((n) => n.isOdd);

7.6 sort #

dart
var numbers = [3, 1, 4, 1, 5, 9, 2, 6];
numbers.sort((a, b) => a.compareTo(b));
numbers.sort((a, b) => b.compareTo(a));

var names = ['Charlie', 'Alice', 'Bob'];
names.sort((a, b) => a.toLowerCase().compareTo(b.toLowerCase()));

7.7 链式调用 #

dart
var result = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  .where((n) => n > 3)
  .map((n) => n * 2)
  .where((n) => n < 15)
  .toList();

八、递归函数 #

8.1 基本递归 #

dart
int factorial(int n) {
  if (n <= 1) return 1;
  return n * factorial(n - 1);
}

int fibonacci(int n) {
  if (n <= 1) return n;
  return fibonacci(n - 1) + fibonacci(n - 2);
}

8.2 尾递归优化 #

dart
int factorialTail(int n, [int result = 1]) {
  if (n <= 1) return result;
  return factorialTail(n - 1, n * result);
}

int fibonacciTail(int n, [int a = 0, int b = 1]) {
  if (n == 0) return a;
  if (n == 1) return b;
  return fibonacciTail(n - 1, b, a + b);
}

九、总结 #

9.1 核心要点 #

要点 说明
函数定义 普通函数、箭头函数
参数 位置参数、命名参数、默认值
匿名函数 无名称函数,常用于回调
闭包 访问外部变量的函数
高阶函数 接收或返回函数的函数

9.2 下一步 #

掌握了函数与闭包后,让我们继续学习 类与对象

最后更新:2026-03-28