一、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)) → void
var list = [1,2,3,4,5];
list.forEach((e) => print(e));
Set
forEach(void f(E element)) → void
var set = {1,2,3,4,5};
set.forEach((e) => print(e));
Map
forEach(void f(K key, V value)) → void
var 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); // 0
testList.add(1);
print(testList.length); // 1
固定长度,不能动态增加长度
var fixedList = List(2);
print(testList.length); // 2
testList[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); // 3
print(list.indexOf('')); // 1
list.add(null); // [1, '', false, null]
list.remove(false); // [1, '', null]
print(list.reversed); // (null, , 1) 只读
print(list.first); // 1
print(list.last); // null
list.addAll(['ok', true]); // [1, '', null, 'ok', true]
list.clear(); // [1, '', null, 'ok', true]
添加
在列表末尾添加一个或多个元素
add(E value) → void
addAll(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) → void
insertAll(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)) → bool
any(bool test(E element)) → bool
var list = [1,2,3,4,5];
bool f1 = list.every((e) => e > 0); // true
bool 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); // false
print(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) → bool
addAll(Iterable<E> elements) → void
var testSet = new Set<int>();
testSet.add(1); // {1}
testSet.addAll({2,2,3}); // {1, 2, 3}
移除
remove(Object value) → bool
removeAll(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)); // true
print(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)) → bool
any(bool test(E element)) → bool
where(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"]); // null
print(testMap2["a"]); // a
print(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);
// 是否存在key
print(intMap.containsKey(1)); // true
常用属性及方法
Map 继承了 Iterable 的属性及方法, 重写了部分属性及方法
keys → Iterable<K>
返回所有 keyvalues → Iterable<V>
返回所有 valueentries → Iterable<MapEntry<K, V>>
添加
addAll(Map<K, V> other) → void
addEntries(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}