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