ZetCode

Dart 列表

最后修改于 2025 年 4 月 4 日

在 Dart 中,List 是元素的有序集合。它维护插入顺序并允许重复值。列表类似于其他语言中的数组。

Dart 中的列表可以是固定长度的,也可以是可增长的。可增长列表可以动态更改大小。列表是零索引的,并支持各种操作。

创建列表

有几种方法可以在 Dart 中创建列表。最简单的方法是使用方括号的列表字面量。

main.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 提供了各种方法来安全地访问元素。

main.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

添加和删除元素

可增长列表支持元素的动态添加和删除。以下是常见操作。

main.dart
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 提供了多种迭代列表元素的方法。以下是最常见的模式。

main.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 列表支持各种操作,如排序、过滤和切片。

main.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。

main.dart
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]

最佳实践

来源

Dart 列表文档

本教程涵盖了 Dart 的列表,并通过实际示例演示了其主要功能和用法模式。

作者

我叫 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教学编程方面有十多年的经验。

列出 所有 Dart 教程