目录

集合

Dart 内置支持列表、集合和映射 集合 。要了解有关配置集合包含的类型的更多信息,请查看泛型

列表

#

在几乎每种编程语言中,最常见的集合可能是 数组 ,或者说是对象的排序组。在 Dart 中,数组是 List 对象,所以大多数人只是称它们为 列表

Dart 列表字面量由用方括号 ([]) 括起来的逗号分隔的表达式或值表示。这是一个简单的 Dart 列表:

dart
var list = [1, 2, 3];

您可以在 Dart 集合字面量的最后一个项目后添加逗号。这个 尾随逗号 不会影响集合,但它可以帮助防止复制粘贴错误。

dart
var list = [
  'Car',
  'Boat',
  'Plane',
];

列表使用基于零的索引,其中 0 是第一个值的索引, list.length - 1 是最后一个值的索引。您可以使用 .length 属性获取列表的长度,并使用下标运算符 ([]) 访问列表的值:

dart
var list = [1, 2, 3];
assert(list.length == 3);
assert(list[1] == 2);

list[1] = 1;
assert(list[1] == 1);

要创建一个编译时常量列表,请在列表字面量之前添加 const

dart
var constantList = const [1, 2, 3];
// constantList[1] = 1; // 此行将导致错误。

有关列表的更多信息,请参阅 dart:core 文档 的列表部分。

集合

#

Dart 中的集合是唯一项目的无序集合。Dart 对集合的支持由集合字面量和 Set 类型提供。

这是一个使用集合字面量创建的简单 Dart 集合:

dart
var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};

要创建一个空集合,请使用以类型参数为前缀的 {} ,或将 {} 分配给 Set 类型的变量:

dart
var names = <String>{};
// Set<String> names = {}; // 这也行得通。
// var names = {}; // 创建一个映射,而不是一个集合。

使用 add()addAll() 方法向现有集合中添加项目:

dart
var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);

使用 .length 获取集合中项目的数量:

dart
var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);
assert(elements.length == 5);

要创建一个编译时常量集合,请在集合字面量之前添加 const

dart
final constantSet = const {
  'fluorine',
  'chlorine',
  'bromine',
  'iodine',
  'astatine',
};
// constantSet.add('helium'); // 此行将导致错误。

有关集合的更多信息,请参阅 dart:core 文档 的集合部分。

映射

#

一般来说,映射是一个关联键和值的 对象。键和值都可以是任何类型的对象。每个 只出现一次,但您可以多次使用相同的 。Dart 对映射的支持由映射字面量和 Map 类型提供。

以下是一些使用映射字面量创建的简单 Dart 映射:

dart
var gifts = {
  // 键:值
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};

var nobleGases = {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};

您可以使用 Map 构造函数创建相同的对象:

dart
var gifts = Map<String, String>();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';

var nobleGases = Map<int, String>();
nobleGases[2] = 'helium';
nobleGases[10] = 'neon';
nobleGases[18] = 'argon';

使用下标赋值运算符 ([]=) 向现有映射中添加新的键值对:

dart
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // 添加键值对

使用下标运算符 ([]) 从映射中检索值:

dart
var gifts = {'first': 'partridge'};
assert(gifts['first'] == 'partridge');

如果您查找映射中不存在的键,则会返回 null

dart
var gifts = {'first': 'partridge'};
assert(gifts['fifth'] == null);

使用 .length 获取映射中键值对的数量:

dart
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds';
assert(gifts.length == 2);

要创建一个编译时常量映射,请在映射字面量之前添加 const

dart
final constantMap = const {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};

// constantMap[2] = 'Helium'; // 此行将导致错误。

有关映射的更多信息,请参阅 dart:core 文档 的映射部分。

运算符

#

展开运算符

#

Dart 在列表、映射和集合字面量中支持 展开运算符 (...) 和 空感知展开运算符 (...?)。展开运算符提供了一种简洁的方式将多个值插入集合中。

例如,您可以使用展开运算符 (...) 将列表的所有值插入另一个列表中:

dart
var list = [1, 2, 3];
var list2 = [0, ...list];
assert(list2.length == 4);

如果展开运算符右侧的表达式可能为 null,则可以使用空感知展开运算符 (...?) 来避免异常:

dart
var list2 = [0, ...?list];
assert(list2.length == 1);

有关使用展开运算符的更多详细信息和示例,请参阅 展开运算符提案

控制流运算符

#

Dart 提供 集合 if集合 for 用于列表、映射和集合字面量。您可以使用这些运算符使用条件语句 (if) 和重复语句 (for) 来构建集合。

这是一个使用 集合 if 创建一个包含三个或四个项目的列表的示例:

dart
var nav = ['Home', 'Furniture', 'Plants', if (promoActive) 'Outlet'];

Dart 还支持集合字面量中的 if-case

dart
var nav = ['Home', 'Furniture', 'Plants', if (login case 'Manager') 'Inventory'];

这是一个使用 集合 for 在将列表的项目添加到另一个列表之前操作它们的示例:

dart
var listOfInts = [1, 2, 3];
var listOfStrings = ['#0', for (var i in listOfInts) '#$i'];
assert(listOfStrings[1] == '#1');

有关使用集合 iffor 的更多详细信息和示例,请参阅 控制流集合提案