Dart 列表
最后修改于 2025 年 4 月 4 日
在 Dart 中,List 是元素的有序集合。它维护插入顺序并允许重复值。列表类似于其他语言中的数组。
Dart 中的列表可以是固定长度的,也可以是可增长的。可增长列表可以动态更改大小。列表是零索引的,并支持各种操作。
创建列表
有几种方法可以在 Dart 中创建列表。最简单的方法是使用方括号的列表字面量。
void main() {
// Using list literal
var fruits = ['apple', 'banana', 'orange'];
print(fruits);
// Using List constructor
var numbers = List<int>.filled(3, 0);
numbers[0] = 1;
numbers[1] = 2;
numbers[2] = 3;
print(numbers);
}
第一个示例创建了一个可增长的字符串列表。第二个示例创建了一个用零初始化的固定长度列表。然后我们为每个索引赋值。
$ dart main.dart [apple, banana, orange] [1, 2, 3]
访问列表元素
可以使用索引表示法访问列表元素。Dart 提供了各种方法来安全地访问元素。
void main() {
var colors = ['red', 'green', 'blue', 'yellow'];
// Access by index
print(colors[0]); // red
print(colors[3]); // yellow
// Safe access with elementAt
print(colors.elementAt(2)); // blue
// First and last elements
print('First: ${colors.first}');
print('Last: ${colors.last}');
// Length
print('Length: ${colors.length}');
}
我们演示了访问列表元素的各种方法。elementAt 比 [] 更安全,因为它会为无效索引抛出 RangeError。first 和 last 很方便。
$ dart main.dart red yellow blue First: red Last: yellow Length: 4
添加和删除元素
可增长列表支持元素的动态添加和删除。以下是常见操作。
void main() {
var numbers = [1, 2, 3];
// Adding elements
numbers.add(4);
numbers.addAll([5, 6]);
numbers.insert(0, 0);
print('After adding: $numbers');
// Removing elements
numbers.remove(6);
numbers.removeAt(0);
numbers.removeLast();
print('After removing: $numbers');
// Clear all
numbers.clear();
print('After clear: $numbers');
}
add 追加单个元素,而 addAll 追加多个。insert 将元素放在特定位置。各种 remove 方法可以删除元素。
$ dart main.dart After adding: [0, 1, 2, 3, 4, 5, 6] After removing: [1, 2, 3, 4] After clear: []
列表迭代
Dart 提供了多种迭代列表元素的方法。以下是最常见的模式。
void main() {
var languages = ['Dart', 'Python', 'Java', 'C#'];
// for loop
print('for loop:');
for (var i = 0; i < languages.length; i++) {
print(languages[i]);
}
// for-in loop
print('\nfor-in loop:');
for (var lang in languages) {
print(lang);
}
// forEach
print('\nforEach:');
languages.forEach((lang) => print(lang));
// map
print('\nmap:');
var upper = languages.map((lang) => lang.toUpperCase());
print(upper);
}
for 循环提供索引访问。for-in 更简单,用于元素访问。forEach 是函数式风格。map 将元素转换为新的可迭代对象。
$ dart main.dart for loop: Dart Python Java C# for-in loop: Dart Python Java C# forEach: Dart Python Java C# map: (DART, PYTHON, JAVA, C#)
列表操作
Dart 列表支持各种操作,如排序、过滤和切片。
void main() {
var numbers = [5, 2, 8, 1, 7, 3, 9, 4, 6];
// Sorting
numbers.sort();
print('Sorted: $numbers');
// Reversing
var reversed = numbers.reversed.toList();
print('Reversed: $reversed');
// Filtering
var even = numbers.where((n) => n % 2 == 0).toList();
print('Even numbers: $even');
// Sublist
var middle = numbers.sublist(2, 5);
print('Middle sublist: $middle');
// Shuffling
numbers.shuffle();
print('Shuffled: $numbers');
}
sort 会就地修改列表。reversed 返回一个需要 toList 的可迭代对象。where 过滤元素。sublist 提取一部分。shuffle 随机化顺序。
$ dart main.dart Sorted: [1, 2, 3, 4, 5, 6, 7, 8, 9] Reversed: [9, 8, 7, 6, 5, 4, 3, 2, 1] Even numbers: [2, 4, 6, 8] Middle sublist: [3, 4, 5] Shuffled: [5, 9, 1, 6, 3, 8, 2, 4, 7]
展开运算符和集合 if/for
Dart 在列表字面量中支持展开运算符 (...) 和集合 if/for。
void main() {
var list1 = [1, 2, 3];
var list2 = [4, 5, 6];
// Spread operator
var combined = [...list1, ...list2];
print('Combined: $combined');
// Collection if
var includeZero = true;
var numbers = [if (includeZero) 0, ...list1];
print('With optional zero: $numbers');
// Collection for
var squares = [for (var n in list2) n * n];
print('Squares: $squares');
}
展开运算符将列表展开为单独的元素。集合 if 有条件地包含元素。集合 for 在列表创建过程中转换元素。
$ dart main.dart Combined: [1, 2, 3, 4, 5, 6] With optional zero: [0, 1, 2, 3] Squares: [16, 25, 36]
最佳实践
- 类型安全:始终指定列表类型以提高代码清晰度。
- 可增长列表:除非需要固定大小,否则首选可增长列表。
- 不可变列表:对只读列表使用 List.unmodifiable。
- 性能:频繁插入/删除时考虑 LinkedList。
来源
本教程涵盖了 Dart 的列表,并通过实际示例演示了其主要功能和用法模式。
作者
列出 所有 Dart 教程。