集合

Last updated: ... / Reads: 38 Edit

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

列表

也许几乎所有编程语言中最常见的集合是数组,或者有序的对象组。在 Dart 中,数组是 List 对象,因此大多数人都将其称为列表。

Dart 列表文字由逗号分隔的表达式或值列表表示,括在方括号 ( [] ) 中。这是一个简单的 Dart 列表:

var list = [1, 2, 3];

Dart 推断 list 具有类型 List 。如果您尝试将非整数对象添加到此列表,分析器或运行时会引发错误。有关更多信息,请阅读类型推断。

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

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

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

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

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

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

var constantList = const [1, 2, 3];
// constantList[1] = 1; // This line will cause an error.

有关列表的更多信息,请参阅图书馆之旅的列表部分。

Sets

Dart 中的集合是独特项目的无序集合。 Dart 对集合的支持是由集合文字和 Set 类型提供的。

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

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

Dart 推断 halogens 具有类型 Set 。如果您尝试向集合中添加错误类型的值,分析器或运行时会引发错误。有关更多信息,请阅读类型推断。

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

var names = <String>{};
// Set<String> names = {}; // This works, too.
// var names = {}; // Creates a map, not a set.

设定还是地图?映射文字的语法与集合文字的语法类似。由于地图文字排在第一位,因此 {} 默认为 Map 类型。如果您忘记 {} 上的类型注释或其分配给它的变量,则 Dart 会创建一个 Map<dynamic, dynamic> 类型的对象。

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

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

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

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

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

final constantSet = const {
  'fluorine',
  'chlorine',
  'bromine',
  'iodine',
  'astatine',
};
// constantSet.add('helium'); // This line will cause an error.

有关集合的更多信息,请参阅库之旅的集合部分。

Map

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

以下是使用地图文字创建的几个简单的 Dart 地图:

var gifts = {
  // Key:    Value
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};

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

Dart 推断 gifts 的类型为 Map<String, String> ,而 nobleGases 的类型为 Map<int, String> 。如果您尝试向任一映射添加错误类型的值,分析器或运行时会引发错误。有关更多信息,请阅读类型推断。

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

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';

如果您来自 C# 或 Java 等语言,您可能希望看到 new Map() 而不仅仅是 Map() 。在 Dart 中, new 关键字是可选的。有关详细信息,请参阅使用构造函数。

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

var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // Add a key-value pair

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

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

如果您查找地图中没有的密钥,您将得到 null 作为回报:

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

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

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

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

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

// constantMap[2] = 'Helium'; // This line will cause an error.

运算符

价差运算符

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

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

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

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

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

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

控制流运算符

Dart 提供了 if 集合和集合,用于列表、映射和集合文字。您可以使用这些运算符通过条件 ( if ) 和重复 ( for ) 构建集合。

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

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

Dart 还支持集合文字内的 if-case:

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

下面是一个在将列表项添加到另一个列表之前使用集合来操作列表项的示例:

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

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


Comments

Make a comment