一、Iterable

List、Set、Map 的 keys、values 和 entries (非 Map 本身) 均继承自 Iterable, 因而 Iterable 的所有属性及方法 List、Set、Map 的 keys、values 和 entries 均可使用

常用属性和方法

属性:

  • length → int 长度, 只读
  • first → E 返回第一个元素, 只读
  • last → E 返回最后一个元素, 只读
  • isEmpty → bool 列表是否为空, 只读
  • isNotEmpty → bool 列表是否不空, 只读

迭代遍历

for..in

List

  1. List list = [1,2,3,4,5];
  2. for (var x in list) {
  3. print(x);
  4. }

Set

  1. var set = {1,2,3,4,5};
  2. for (var e in set) {
  3. print(e);
  4. }

Map

  1. var map = {1: 'a',2: 'b',3: 'c',4: 'd',5: 'e'};
  2. for (var key in map.keys) {
  3. print('$key => ${map[key]}');
  4. }

forEach

List

  • forEach(void f(E element)) → void
    1. var list = [1,2,3,4,5];
    2. list.forEach((e) => print(e));

Set

  • forEach(void f(E element)) → void
    1. var set = {1,2,3,4,5};
    2. set.forEach((e) => print(e));

Map

  • forEach(void f(K key, V value)) → void
    1. var map = {1: 'a',2: 'b',3: 'c',4: 'd',5: 'e'};
    2. map.forEach((k, v) => print('$k => $v'));

二、List

创建列表

非固定长度, 可以通过 add 方法添加元素

  1. var testList = List();
  2. // List testList = List();
  3. print(testList.length); // 0
  4. testList.add(1);
  5. print(testList.length); // 1

固定长度,不能动态增加长度

  1. var fixedList = List(2);
  2. print(testList.length); // 2
  3. testList[0] = 1;
  4. // testList[2] = 1; // Error
  5. // testList.add(1); // Error

通过 List.fromList.of 转换

  1. var s = {1, 2, 3};
  2. var l = List.from(s); // [1, 2, 3]
  1. var s = {1, 2, 3};
  2. var l = List.of(s); // [1, 2, 3]

通过 List.filled 填充

  1. var l = List.filled(3, 2); // [2, 2, 2]

使用泛型,固定元素类型

  1. var typeList = List<String>(); // 只能添加字符串类型的元素
  2. typeList.add("hello"); // 正确
  3. typeList.add(1); // 错误。类型不正确

直接赋值

  1. var numList = [1, 2, 3]; // 编译器猜测类型为 List<int>
  2. numList.add("hello"); // 错误,类型不正确
  3. var dyList = [true, 1]; // 编译器猜测类型为 List<dynamic>
  4. dyList.add("hello"); // ok

常用属性及方法

List 继承了 Iterable 的属性及方法,重写了部分属性及方法

  • length ↔ int 长度
  • first ↔ E 返回第一个元素
  • last ↔ E 返回最后一个元素
  • reversed → Iterable<E> 反转列表, 只读
  • indexOf(E element, [ int start = 0 ]) → int 查询元素索引(索引从 0 开始)
  • lastIndexOf(E element, [ int start ]) → int 从末尾开始查询元素索引
  • clear() → void 清空列表

举例:

  1. var list = [1, '', false];
  2. print(list.length); // 3
  3. print(list.indexOf('')); // 1
  4. list.add(null); // [1, '', false, null]
  5. list.remove(false); // [1, '', null]
  6. print(list.reversed); // (null, , 1) 只读
  7. print(list.first); // 1
  8. print(list.last); // null
  9. list.addAll(['ok', true]); // [1, '', null, 'ok', true]
  10. list.clear(); // [1, '', null, 'ok', true]

添加

在列表末尾添加一个或多个元素

  • add(E value) → void
  • addAll(Iterable<E> iterable) → void

示例:

  1. var list = [1,2,3];
  2. list.add(1, 5); // [1, 2, 3, 5]
  3. list.addAll(1, [10,20]); // [1, 2, 3, 5, 10, 20]

插入

在列表指定位置插入一个或多个元素

  • insert(int index, E element) → void
  • insertAll(int index, Iterable<E> iterable) → void

示例:

  1. var list = [1,2,3];
  2. list.insert(1, 5); // [1, 5, 2, 3]
  3. list.insertAll(1, [10,20]); // [1, 10, 20, 5, 2, 3]

移除

  • remove(Object value) → bool 移除指定元素
  • removeAt(int index) → E 移除指定下标的元素
  • removeLast() → E 出栈(移除最后一个元素)
  • removeRange(int start, int end) → void 移除范围内元素

示例:

  1. var list = [1,2,3,4,5];
  2. list.remove(1); // [2, 3, 4, 5]
  3. list.removeAt(1); // [2, 4, 5]
  4. list.removeLast(); // [2, 4]
  5. list = [1,2,3,4,5];
  6. list.removeRange(0, 2); // [3, 4, 5]

排序

  • sort([int compare(E a, E b) ]) → void

示例:

  1. var fruits = ['bananas', 'apples', 'oranges'];
  2. // 排序一个 list 。
  3. fruits.sort((a, b) => a.compareTo(b));
  4. print(fruits); // [apples, bananas, oranges]

其他

  • contains(Object element) → bool 检测列表是否包含某个元素
  • elementAt(int index) → E 返回某个下标的元素

类型转换

转换为 Map<int, E>

  1. var list = [1, '', false, 'ok', true];
  2. list.asMap(); // {0: 1, 1: , 2: false, 3: ok, 4: true}

转换为 Set<E>

  1. var list = [1, 2, 3, 3, 4, 5];
  2. print(list.toSet()); // {1, 2, 3, 4, 5}

转换为 String

  1. list.toString();

高阶函数

every

跟 JS 一样, 不多解释了

  • every(bool test(E element)) → bool
  • any(bool test(E element)) → bool
  1. var list = [1,2,3,4,5];
  2. bool f1 = list.every((e) => e > 0); // true
  3. bool f2 = list.any((e) => e < 0); // false

reduce

跟 JS 一样, 不多解释了

  • reduce(E combine(E value, E element)) → E
  1. var list = [1,2,3,4,5];
  2. var r = list.reduce((e1, e2) => e1 + e2); // 15

map

map 可以对列表进行操作,但注意需要通过 toList 返回新的列表

  • map<T>(T f(E e)) → Iterable<T>
  1. var list = [1,2,3,4,5];
  2. var l2 = list.map((e) => e + 1).toList(); // [2, 3, 4, 5, 6]

where

类似于 JS 的 filter,用于筛选指定条件的元素

  1. var testList = [1, 2, 3, 4];
  2. var whereList = testList.where((num) => num > 2).toList(); // [3, 4]

运算符重载

+ 被重置为拼接两个列表

  1. var list1 = [1,2,3];
  2. var list2 = [3,4,5];
  3. print(list1 + list2); // [1, 2, 3, 3, 4, 5]

== 用于比较连个列表是否指向同一片内存区域:

  1. var list1 = [3,4,5];
  2. var list2 = [3,4,5];
  3. var list3 = list1;
  4. print(list1 == list2); // false
  5. print(list1 == list3); // true
  • operator [](int index) → E 取值
  • operator []=(int index, E value) → void 赋值

三、Set

Set 是没有顺序且不能重复的集合,所以不能通过索引去获取值。

创建集合

  1. var testSet = new Set();
  2. print(testSet.length); // 0
  3. // var testSet2 = new Set(2); // 错误,Set没有固定元素的定义
  4. testSet.add(1);
  5. testSet.add(1); // 重复元素无效
  6. testSet.add("a"); // {1, "a"}
  7. testSet.addAll(['b', 'c']); // (1, 'a', 'b', 'c')
  8. testSet.remove('b'); // (1, 'a', 'c')
  9. print(testSet.contains(1)); // true

通过 Set.fromSet.of 转换

  1. var l = [1,2,2,3,3];
  2. var s = Set.from(l); // {1, 2, 3}
  1. var l = [1,2,2,3,3];
  2. var s = Set.of(l); // {1, 2, 3}

使用泛型:

  1. var testSet = new Set<int>();
  2. testSet.add(1);

直接赋值:

  1. var s = {1, 2, 3};

常用属性及方法

Set 继承了 Iterable 的属性及方法, 重写了部分属性及方法

添加

  • add(E value) → bool
  • addAll(Iterable<E> elements) → void
  1. var testSet = new Set<int>();
  2. testSet.add(1); // {1}
  3. testSet.addAll({2,2,3}); // {1, 2, 3}

移除

  • remove(Object value) → bool
  • removeAll(Iterable<Object> elements) → void
  1. var testSet = {1,2,3};
  2. testSet.remove(2);
  3. testSet.removeAll({1, 3});

包含

  • contains(Object value) → bool 是否包含某个元素
  • containsAll(Iterable<Object> other) → bool 是否包含多个元素
  1. var ingredients = Set();
  2. ingredients.addAll(['gold', 'titanium', 'xenon']);
  3. print(ingredients.contains('titanium'));
  4. print(ingredients.containsAll(['titanium', 'xenon']));
  5. var testSet = {1,2,3};
  6. print(testSet.contains(1)); // true
  7. print(testSet.containsAll({2,3})); // true

其他

  • difference(Set<Object> other) → Set<E> 返回与传入 Set 不同的元素
  1. var testSet1 = {1,2,3};
  2. var testSet2 = {2,3,4};
  3. print(testSet1.difference(testSet2)); // {1}
  • clear() → void 清空 Set

类型转换

转换为 List<E>

  1. var testSet = Set.from(["a", "b", "c"]);
  2. var listIter = testSet.map((v) => v.toUpperCase()).toList(); // [A, B, C]

高阶函数

map

  1. var testSet = {1,2,3};
  2. var setIter = testSet.map((v) => v + 1); // (2, 3, 4)

其他高阶函数

  • every(bool test(E element)) → bool
  • any(bool test(E element)) → bool
  • where(bool test(E element)) → Iterable<E>

四、Map

创建字典

  1. var testMap = Map();
  2. var testMap2 = {'a': 'a', 'b': 'b', 'c': 'c', 'd': 'd', 'e': 'e'};
  3. // 长度属性
  4. print(testMap.length); // 0
  5. // 获取值
  6. print(testMap["a"]); // null
  7. print(testMap2["a"]); // a
  8. print(testMap2.keys); // {'a', 'b', 'c'}
  9. print(testMap2.values); // {'a', 'b', 'c'}

使用泛型

  1. var intMap = Map<int, String>();
  2. // map新增元素
  3. intMap[1] = "Num 1";
  4. intMap[2] = "Num 2";
  5. intMap['a'] = "Char a:"; // 错误,类型不正确。
  6. // 删除元素
  7. intMap.remove(2);
  8. // 是否存在key
  9. print(intMap.containsKey(1)); // true

常用属性及方法

Map 继承了 Iterable 的属性及方法, 重写了部分属性及方法

  • keys → Iterable<K> 返回所有 key
  • values → Iterable<V> 返回所有 value
  • entries → Iterable<MapEntry<K, V>>

添加

  • addAll(Map<K, V> other) → void
  • addEntries(Iterable<MapEntry<K, V>> newEntries) → void
  1. Map<dynamic, dynamic> testMap = {'a': 'a', 'b': 'b', 'c': 'c', 'd': 'd', 'e': 'e'};
  2. testMap.addAll({1: 1, 2: 2});
  3. testMap.addEntries({new MapEntry(3, 3)});

移除

  • remove(Object key) → V
  1. Map testMap = {'a': 'a', 'b': 'b', 'c': 'c', 'd': 'd', 'e': 'e'};
  2. testMap.remove('a');

其他

  • clear() → void 清空 Map
  • containsKey(Object key) → bool 是否包括 key
  • containsValue(Object value) → bool 是否包括 value

高阶函数

map

  • map<K2, V2>(MapEntry<K2, V2> f(K key, V value)) → Map<K2, V2>
  1. Map testMap = {'a': 'a', 'b': 'b', 'c': 'c', 'd': 'd', 'e': 'e'};
  2. var newMap = testMap.map((k, v) => new MapEntry(k + 'k', v + 'v')); // {ak: av, bk: bv, ck: cv, dk: dv, ek: ev}

参考资料