Dart汇总请点击这里
Dart 附带了核心集合 API ,其中包括 list ,set 和 map 类。
如Dart基础中介绍,lists 可以通过字面量来创建和初始化。 另外,也可以使用 List 的构造函数。
// 使用 List 构造函数。
var vegetables = List();
// 或者仅使用一个 list 字面量。
var fruits = ['apples', 'oranges'];
// 添加一个元素到 list 对象。
fruits.add('kiwis');
// 添加多个元素到 list 对象。
fruits.addAll(['grapes', 'bananas']);
// 获取 list 长度。
assert(fruits.length == 5);
// 移除一个元素到 list 对象。
var appleIndex = fruits.indexOf('apples');
fruits.removeAt(appleIndex);
assert(fruits.length == 4);
// 移除多个元素到 list 对象。
fruits.clear();
assert(fruits.length == 0);
var fruits = ['apples', 'oranges'];
// 使用下标访问 list 中的元素
assert(fruits[0] == 'apples');
// 查找一个元素在 list 中的下标。
assert(fruits.indexOf('apples') == 0);
你可以提供一个排序函数用于比较两个对象。 比较函数在 小于 时返回 <0,相等 时返回 0,大于 时返回 > 0 。 下面示例中使用 compareTo() 函数, 该函数在 Comparable 中定义, 并被 String 类实现。
var fruits = ['bananas', 'apples', 'oranges'];
// 排序一个 list 。
fruits.sort((a, b) => a.compareTo(b));
assert(fruits[0] == 'apples');
// 这个 list 只能包含字符串类型。
var fruits = List<String>();
fruits.add('apples');
var fruit = fruits[0];
assert(fruit is String);
// 产生静态分析警告,num 不是字符串类型。
fruits.add(5); // BAD: Throws exception in checked mode.
fruits.add(5); // Error: 'int' can't be assigned to 'String'
在 Dart 中,set 是一个无序的,元素唯一的集合。 因为一个 set 是无序的,所以无法通过下标(位置)获取 set 中的元素。
var ingredients = Set();
ingredients.addAll(['gold', 'titanium', 'xenon']);
assert(ingredients.length == 3);
// 添加一个重复的元素是无效的。
ingredients.add('gold');
assert(ingredients.length == 3);
// 从 set 中移除一个元素。
ingredients.remove('gold');
assert(ingredients.length == 2);
var ingredients = Set();
ingredients.addAll(['gold', 'titanium', 'xenon']);
// 检查一个元素是否在该 set 中。
assert(ingredients.contains('titanium'));
// 检查多个元素是否在该 set 中。
assert(ingredients.containsAll(['titanium', 'xenon']));
var ingredients = Set();
ingredients.addAll(['gold', 'titanium', 'xenon']);
// 创建两个 set 的交集。
var nobleGases = Set.from(['xenon', 'argon']);
var intersection = ingredients.intersection(nobleGases);
assert(intersection.length == 1);
assert(intersection.contains('xenon'));
map 是一个无序的 key-value (键值对)集合,就是大家熟知的 dictionary 或者 hash。 map 将 kay 与 value 关联,以便于检索。和 JavaScript 不同,Dart 对象不是 map 。
// map 通常使用字符串作为 key。
var hawaiianBeaches = {
'Oahu': ['Waikiki', 'Kailua', 'Waimanalo'],
'Big Island': ['Wailea Bay', 'Pololu Beach'],
'Kauai': ['Hanalei', 'Poipu']
};
// map 可以通过构造函数构建。
var searchTerms = Map();
// map 是参数化类型;
// 可以指定一个 map 中 key 和 value 的类型。
var nobleGases = Map<int, String>();
var nobleGases = {54: 'xenon'};
// 使用 key 检索 value 。
assert(nobleGases[54] == 'xenon');
// 检查 map 是否包含 key 。
assert(nobleGases.containsKey(54));
// 移除一个 key 及其 value。
nobleGases.remove(54);
assert(!nobleGases.containsKey(54));
var hawaiianBeaches = {
'Oahu': ['Waikiki', 'Kailua', 'Waimanalo'],
'Big Island': ['Wailea Bay', 'Pololu Beach'],
'Kauai': ['Hanalei', 'Poipu']
};
// 获取的所有的 key 是一个无序集合
// (可迭代 list 对象)。
var keys = hawaiianBeaches.keys;
assert(keys.length == 3);
assert(Set.from(keys).contains('Oahu'));
// 获取的所有的 value 是一个无序集合
// (可迭代 list 对象).
var values = hawaiianBeaches.values;
assert(values.length == 3);
assert(values.any((v) => v.contains('Waikiki')));
因为 map 中的 value 可能会是 null , 所有通过 key 获取 value,并通过判断 value 是否为 null 来判断 key 是否存在是不可靠的。
var hawaiianBeaches = {
'Oahu': ['Waikiki', 'Kailua', 'Waimanalo'],
'Big Island': ['Wailea Bay', 'Pololu Beach'],
'Kauai': ['Hanalei', 'Poipu']
};
assert(hawaiianBeaches.containsKey('Oahu'));
assert(!hawaiianBeaches.containsKey('Florida'));
如果当且仅当该 key 不存在于 map 中,且要为这个 key 赋值, 可使用putIfAbsent()方法。 该方法需要一个方法返回这个 value 。
var teamAssignments = {};
teamAssignments.putIfAbsent(
'Catcher', () => pickToughestKid());
assert(teamAssignments['Catcher'] != null);
List, Set, 和 Map 共享许多集合中的常用功能。 其中一些常见功能由 Iterable 类定义, 这些函数由 List 和 Set 实现。
虽然Map没有实现 Iterable, 但可以使用 Map keys 和 values 属性从中获取 Iterable 对象。
var coffees = [];
var teas = ['green', 'black', 'chamomile', 'earl grey'];
assert(coffees.isEmpty);
assert(teas.isNotEmpty);
var teas = ['green', 'black', 'chamomile', 'earl grey'];
teas.forEach((tea) => print('I drink $tea'));
当在 map 对象上调用 `forEach() 方法时,函数必须带两个参数(key 和 value):
hawaiianBeaches.forEach((k, v) {
print('I want to visit $k and swim at $v');
// 我想去瓦胡岛并且在
// [Waikiki, Kailua, Waimanalo]游泳, 等等。
});
var teas = ['green', 'black', 'chamomile', 'earl grey'];
var loudTeas = teas.map((tea) => tea.toUpperCase());
loudTeas.forEach(print);
map() 方法返回的对象是一个 懒求值(lazily evaluated)对象: 只有当访问对象里面的元素时,函数才会被调用。
var loudTeas =
teas.map((tea) => tea.toUpperCase()).toList();
var teas = ['green', 'black', 'chamomile', 'earl grey'];
// 洋甘菊不含咖啡因。
bool isDecaffeinated(String teaName) =>
teaName == 'chamomile';
// 使用 where() 来查找元素,
// 这些元素在给定的函数中返回 true 。
var decaffeinatedTeas =
teas.where((tea) => isDecaffeinated(tea));
// 或者 teas.where(isDecaffeinated)
// 使用 any() 来检查集合中是否至少有一个元素满足条件。
assert(teas.any(isDecaffeinated));
// 使用 every() 来检查集合中是否所有元素满足条件。
assert(!teas.every(isDecaffeinated));