集合与泛型

除了变量与基本类型介绍的基本类型,Dart 标准库还提供了很多其他类型,比如最常用的集合类型(Collections)。

泛型(Generics)可以提高类型安全并减少重复代码,而集合类型几乎都支持泛型,所以本节也将对它进行简要介绍。

集合

Dart 的集合类型主要是来自 dart:core 库的 ListSetMap

List

List表示有序的数据列表,它其实就是其他语言中常见的数组(array)。

List 可以使用字面量(如:[a1, a2]的形式)或构造函数创建。

  1. var gameList = ['Halo', 'God of War']; // 字面量形式
  2. gameList = new List(); // 使用构造函数
  3. gameList.add('The Witcher'); // 使用add方法添加数据
  4. gameList.add('Dark Souls');
  5. // 通过getter或索引访问元素
  6. print(gameList.frist);
  7. print(gameList.last);
  8. print(gameList[0]);
  9. // 通过for...in循环遍历
  10. for (var game in gameList) {
  11. print(game);
  12. }

Set

Set是无序的数据集合,其中对象不可(不会)重复。

Set 可以使用字面量(如:{'dart', 'javascript'})或构造函数创建。

注意:访问Set中的元素时,它们的顺序不能得到保证,默认顺序为元素的添加顺序。

  1. var gameSet = {'Halo', 'God of War'}; // 字面量形式
  2. gameSet = new Set(); // 使用构造函数
  3. gameSet.add('The Witcher'); // 使用add方法添加数据
  4. gameSet.add('Dark Souls');
  5. // 通过getter访问元素
  6. print(gameSet.frist);
  7. print(gameSet.last);
  8. // 通过for...in循环遍历
  9. for (var game in gameSet) {
  10. print(game);
  11. }

Map

Map是无序的键值对集合,键(key)和值(value)可以是任意类型,其中键不可(不会)重复,值可以重复。

Map 可以使用字面量(如:{'first': 'dart', 'second': 'javascript'})或构造函数创建。

注意:在没有泛型参数的情况下,空Map字面量和空Set字面量的写法都是{}。因为 Dart 的Set字面量是后加入的,所以{}将默认识别为Map类型。

  1. var gameMap = {'microsoft': 'Halo', 'sony' :'God of War'}; // 字面量形式
  2. gameMap = new Map(); // 使用构造函数
  3. gameMap['cdpr'] = 'The Witcher'; // 使用[]添加数据
  4. gameMap['fromsoft'] = 'Dark Souls';
  5. print(gameMap['fromsoft']); // 使用[]访问数据
  6. // 通过for...in循环遍历值
  7. for (var game in gameMap.values) {
  8. print(game);
  9. }

泛型

泛型(Generics)即泛化的类型,就是参数化的类型,Dart 标准库中的很多类型都支持泛型,集合类型是其中的代表。

使用

与其他很多支持泛型的语言一样(如:Java,C#),Dart 的泛型写法也是在类型名称后添加 <类型参数1, 类型参数2, ...>,比如: var gameList = new List<String>()

如果对象是通过字面量形式声明,类型参数则必须写在字面量前面,比如:var scoreMap = new <String, int>{}

使用泛型的类将获得类型安全,在集合类型中的表现就是不能向其中添加除泛型参数之外的类型。

  1. var gameSet = new Set<String>(); // 字符串Set
  2. gameSet.add('Dark Souls'); // OK
  3. gameSet.add(123); // 添加数字,编译报错

注意:不添加类型参数的情况下,类型参数一般会被推断为dynamic,表示不对类型进行限制

// TODO: 更多内容