一、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
List list = [1,2,3,4,5];for (var x in list) {print(x);}
Set
var set = {1,2,3,4,5};for (var e in set) {print(e);}
Map
var map = {1: 'a',2: 'b',3: 'c',4: 'd',5: 'e'};for (var key in map.keys) {print('$key => ${map[key]}');}
forEach
List
forEach(void f(E element)) → voidvar list = [1,2,3,4,5];list.forEach((e) => print(e));
Set
forEach(void f(E element)) → voidvar set = {1,2,3,4,5};set.forEach((e) => print(e));
Map
forEach(void f(K key, V value)) → voidvar map = {1: 'a',2: 'b',3: 'c',4: 'd',5: 'e'};map.forEach((k, v) => print('$k => $v'));
二、List
创建列表
非固定长度, 可以通过 add 方法添加元素
var testList = List();// List testList = List();print(testList.length); // 0testList.add(1);print(testList.length); // 1
固定长度,不能动态增加长度
var fixedList = List(2);print(testList.length); // 2testList[0] = 1;// testList[2] = 1; // Error// testList.add(1); // Error
通过 List.from 或 List.of 转换
var s = {1, 2, 3};var l = List.from(s); // [1, 2, 3]
var s = {1, 2, 3};var l = List.of(s); // [1, 2, 3]
通过 List.filled 填充
var l = List.filled(3, 2); // [2, 2, 2]
使用泛型,固定元素类型
var typeList = List<String>(); // 只能添加字符串类型的元素typeList.add("hello"); // 正确typeList.add(1); // 错误。类型不正确
直接赋值
var numList = [1, 2, 3]; // 编译器猜测类型为 List<int>numList.add("hello"); // 错误,类型不正确var dyList = [true, 1]; // 编译器猜测类型为 List<dynamic>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清空列表
举例:
var list = [1, '', false];print(list.length); // 3print(list.indexOf('')); // 1list.add(null); // [1, '', false, null]list.remove(false); // [1, '', null]print(list.reversed); // (null, , 1) 只读print(list.first); // 1print(list.last); // nulllist.addAll(['ok', true]); // [1, '', null, 'ok', true]list.clear(); // [1, '', null, 'ok', true]
添加
在列表末尾添加一个或多个元素
add(E value) → voidaddAll(Iterable<E> iterable) → void
示例:
var list = [1,2,3];list.add(1, 5); // [1, 2, 3, 5]list.addAll(1, [10,20]); // [1, 2, 3, 5, 10, 20]
插入
在列表指定位置插入一个或多个元素
insert(int index, E element) → voidinsertAll(int index, Iterable<E> iterable) → void
示例:
var list = [1,2,3];list.insert(1, 5); // [1, 5, 2, 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移除范围内元素
示例:
var list = [1,2,3,4,5];list.remove(1); // [2, 3, 4, 5]list.removeAt(1); // [2, 4, 5]list.removeLast(); // [2, 4]list = [1,2,3,4,5];list.removeRange(0, 2); // [3, 4, 5]
排序
sort([int compare(E a, E b) ]) → void
示例:
var fruits = ['bananas', 'apples', 'oranges'];// 排序一个 list 。fruits.sort((a, b) => a.compareTo(b));print(fruits); // [apples, bananas, oranges]
其他
contains(Object element) → bool检测列表是否包含某个元素elementAt(int index) → E返回某个下标的元素
类型转换
转换为 Map<int, E>
var list = [1, '', false, 'ok', true];list.asMap(); // {0: 1, 1: , 2: false, 3: ok, 4: true}
转换为 Set<E>
var list = [1, 2, 3, 3, 4, 5];print(list.toSet()); // {1, 2, 3, 4, 5}
转换为 String
list.toString();
高阶函数
every
跟 JS 一样, 不多解释了
every(bool test(E element)) → boolany(bool test(E element)) → bool
var list = [1,2,3,4,5];bool f1 = list.every((e) => e > 0); // truebool f2 = list.any((e) => e < 0); // false
reduce
跟 JS 一样, 不多解释了
reduce(E combine(E value, E element)) → E
var list = [1,2,3,4,5];var r = list.reduce((e1, e2) => e1 + e2); // 15
map
map 可以对列表进行操作,但注意需要通过 toList 返回新的列表
map<T>(T f(E e)) → Iterable<T>
var list = [1,2,3,4,5];var l2 = list.map((e) => e + 1).toList(); // [2, 3, 4, 5, 6]
where
类似于 JS 的 filter,用于筛选指定条件的元素
var testList = [1, 2, 3, 4];var whereList = testList.where((num) => num > 2).toList(); // [3, 4]
运算符重载
+ 被重置为拼接两个列表
var list1 = [1,2,3];var list2 = [3,4,5];print(list1 + list2); // [1, 2, 3, 3, 4, 5]
== 用于比较连个列表是否指向同一片内存区域:
var list1 = [3,4,5];var list2 = [3,4,5];var list3 = list1;print(list1 == list2); // falseprint(list1 == list3); // true
operator [](int index) → E取值operator []=(int index, E value) → void赋值
三、Set
Set 是没有顺序且不能重复的集合,所以不能通过索引去获取值。
创建集合
var testSet = new Set();print(testSet.length); // 0// var testSet2 = new Set(2); // 错误,Set没有固定元素的定义testSet.add(1);testSet.add(1); // 重复元素无效testSet.add("a"); // {1, "a"}testSet.addAll(['b', 'c']); // (1, 'a', 'b', 'c')testSet.remove('b'); // (1, 'a', 'c')print(testSet.contains(1)); // true
通过 Set.from 或 Set.of 转换
var l = [1,2,2,3,3];var s = Set.from(l); // {1, 2, 3}
var l = [1,2,2,3,3];var s = Set.of(l); // {1, 2, 3}
使用泛型:
var testSet = new Set<int>();testSet.add(1);
直接赋值:
var s = {1, 2, 3};
常用属性及方法
Set 继承了 Iterable 的属性及方法, 重写了部分属性及方法
添加
add(E value) → booladdAll(Iterable<E> elements) → void
var testSet = new Set<int>();testSet.add(1); // {1}testSet.addAll({2,2,3}); // {1, 2, 3}
移除
remove(Object value) → boolremoveAll(Iterable<Object> elements) → void
var testSet = {1,2,3};testSet.remove(2);testSet.removeAll({1, 3});
包含
contains(Object value) → bool是否包含某个元素containsAll(Iterable<Object> other) → bool是否包含多个元素
var ingredients = Set();ingredients.addAll(['gold', 'titanium', 'xenon']);print(ingredients.contains('titanium'));print(ingredients.containsAll(['titanium', 'xenon']));var testSet = {1,2,3};print(testSet.contains(1)); // trueprint(testSet.containsAll({2,3})); // true
其他
difference(Set<Object> other) → Set<E>返回与传入 Set 不同的元素
var testSet1 = {1,2,3};var testSet2 = {2,3,4};print(testSet1.difference(testSet2)); // {1}
clear() → void清空 Set
类型转换
转换为 List<E>
var testSet = Set.from(["a", "b", "c"]);var listIter = testSet.map((v) => v.toUpperCase()).toList(); // [A, B, C]
高阶函数
map
var testSet = {1,2,3};var setIter = testSet.map((v) => v + 1); // (2, 3, 4)
其他高阶函数
every(bool test(E element)) → boolany(bool test(E element)) → boolwhere(bool test(E element)) → Iterable<E>
四、Map
创建字典
var testMap = Map();var testMap2 = {'a': 'a', 'b': 'b', 'c': 'c', 'd': 'd', 'e': 'e'};// 长度属性print(testMap.length); // 0// 获取值print(testMap["a"]); // nullprint(testMap2["a"]); // aprint(testMap2.keys); // {'a', 'b', 'c'}print(testMap2.values); // {'a', 'b', 'c'}
使用泛型
var intMap = Map<int, String>();// map新增元素intMap[1] = "Num 1";intMap[2] = "Num 2";intMap['a'] = "Char a:"; // 错误,类型不正确。// 删除元素intMap.remove(2);// 是否存在keyprint(intMap.containsKey(1)); // true
常用属性及方法
Map 继承了 Iterable 的属性及方法, 重写了部分属性及方法
keys → Iterable<K>返回所有 keyvalues → Iterable<V>返回所有 valueentries → Iterable<MapEntry<K, V>>
添加
addAll(Map<K, V> other) → voidaddEntries(Iterable<MapEntry<K, V>> newEntries) → void
Map<dynamic, dynamic> testMap = {'a': 'a', 'b': 'b', 'c': 'c', 'd': 'd', 'e': 'e'};testMap.addAll({1: 1, 2: 2});testMap.addEntries({new MapEntry(3, 3)});
移除
remove(Object key) → V
Map testMap = {'a': 'a', 'b': 'b', 'c': 'c', 'd': 'd', 'e': 'e'};testMap.remove('a');
其他
clear() → void清空 MapcontainsKey(Object key) → bool是否包括 keycontainsValue(Object value) → bool是否包括 value
高阶函数
map
map<K2, V2>(MapEntry<K2, V2> f(K key, V value)) → Map<K2, V2>
Map testMap = {'a': 'a', 'b': 'b', 'c': 'c', 'd': 'd', 'e': 'e'};var newMap = testMap.map((k, v) => new MapEntry(k + 'k', v + 'v')); // {ak: av, bk: bv, ck: cv, dk: dv, ek: ev}
