List 是一个可索引的集合,相当于JS中的数组。List 可以分为两种:
(1)、固定长度的List:尝试修改List长度时会报错
(2)、可增长的List:通过字面量方式创建的List默认是可增长的
List的两种声明方式
1、字面量方式
(1)、List list = []; // 不限定元素的数据类型
(2)、List list = <int>[]; // 限定元素的数据类型是 int
// 通过字面量声明List List l1 = ['a', 'b', 'c', 1, 2, 3]; print(l1); // [a, b, c, 1, 2, 3] // l1[6] = 'd'; // 下标越界。Invalid value: Not in inclusive range l1[5] = 'd'; l1.add(4); l1.addAll([7, 8]); print(l1); // [a, b, c, 1, 2, d, 4, 7, 8] // 限定元素类型的声明方式 List l2 = <int>[1, 2, 3]; print(l2); // [1, 2, 3] l2.add(4); print(l2); // [1, 2, 3, 4]
2、构造函数方式
(1)、List list = new List.empty(growable: true); // 不限制长度的空列表
(2)、List list = new List.filled(3, 0); // 声明指定长度的填充列表
List<dynamic> List.empty({bool growable = false}) 用于创建一个新的空的List,它接受一个布尔值growable,默认值为false,表示创建一个固定长度为0的List;如果取值为true,表示List可增长 List l3 = new List.empty(); // 等价于 List l3 = new list.empty(growable: false); l3.add(1); // 错误:不能给一个固定长度的List添加元素。Cannot add to a fixed-length list
List l3 = new List.empty(growable: true); l3.add(1); print(l3); // [1] // 创建一个固定长度和固定内容的List List l4 = new List.filled(3, 6); print(l4); // [6, 6, 6] // l4.add(6); // Cannot add to a fixed-length list
常用属性
(1)、长度
print(l1.length); // 6
(2)、反转
print(l1.reversed); // (3, 2, 1, c, b, a) print(l1.reversed.toList()); // [3, 2, 1, c, b, a]
常用方法
(1)、添加元素(针对可增长的List)
void add(dynamic value):添加一个元素到List尾部
void addAll(Iterable<dynamic> iterable):把所有的可迭代对象都添加到List尾部
(2)、检索
indexOf(dynamic element, [int start = 0])
lastIndexOf(dynamic element, [int? start])
print(l1.indexOf('a')); // 0 print(l1.indexOf('h')); // -1 print(l1.lastIndexOf(2)); // 4
(3)、删除
bool remove(Object? value)
dynamic removeAt(int index)
void removeWhere(bool Function(dynamic) test)
// 删除元素 bool result3 = l3.remove(6); print(result3); // true print(l3); // [1, 4, 5] // 根据下标删除元素 dynamic result4 = l3.removeAt(1); print(result4); // 4 print(l3); // [1, 5] l5.removeWhere((element) => element > 0); print(l5); // [0]
(4)、插入元素到指定的位置
void insert(int index, dynamic element)
insertAll(int index, Iterable<dynamic> iterable)
l3.insert(1, 9); print(l3); // [1, 9, 5] l3.insertAll(1, [3, 3]); print(l3); // [1, 3, 3, 9, 5]
(5)、排序
void sort([int Function(dynamic, dynamic)? compare])
List letters = ['e', 'a', 'f', 'ab']; letters.sort((a, b) => a.compareTo(b)); print(letters); // [a, ab, e, f]
(6)、合并
String join([String separator = ""])
List words = ['dart', 'flutter']; String result5 = words.join('-'); print(result5); // dart-flutter
(7)、清空
void clear()
l3.clear(); print(l3.length); // 0 print(l3.isEmpty); // true
遍历方法
void main() { List nums = <int>[1, 2, 3, 4, 5]; // for 循环遍历 for (int i = 0; i < nums.length; i += 1) { print(nums[i]); } // for ... in for (int num in nums) { print(num); } // forEach nums.forEach((element) { print(element); }); // map() 遍历并处理元素,然后生成新的列表 dynamic newNums1 = nums.map((e) => e * e); dynamic newNums2 = nums.map((e) => e * e).toList(); print(newNums1); // (1, 4, 9, 16, 25) print(newNums2); // [1, 4, 9, 16, 25] List newNums3 = nums.map((e) => e * e).toList(); print(newNums3); // [1, 4, 9, 16, 25] // where() 返回满足条件的数据 // 判断数字是否是奇数 bool isOdd(n) => n % 2 == 1; List oddNum = nums.where((element) => isOdd(element)).toList(); print(oddNum); // [1, 3, 5] // any() 只要有一项满足条件,即返回 true // 检测是否有奇数(至少一个) bool hasOdd = nums.any((element) => element % 2 == 1); print(hasOdd); // true // every() 判断是否每一项都满足条件,都满足条件才返回true // 检测是否都是奇数 bool isAllOdd = nums.every((element) => element % 2 == 1); print(isAllOdd); // false // expand() 合并:将列表中的所有元素一个接一个地添加到新列表中,通常用于将两个 // 以上的列表添加在一起 List str1 = ['dart']; List str2 = ['flutter']; List str3 = ['webpack']; List newStr = [str1, str2, str3].expand((element) => element).toList(); print(newStr); // [dart, flutter, webpack] // flod() 折叠:对列表中的每一个元素做累计操作,初始值可以自定义(类似js 的 reduce) List<int> numbers = <int>[2, 4, 6, 8]; int initialValue = 10; int result = numbers.fold<int>( initialValue, (previousValue, element) => previousValue + element); print(result); // 30 // reduce() 对列表中的每一个元素做累计操作,初始值是列表的第一个元素 int reduceResult = numbers.reduce((value, element) => value + element); print(reduceResult); // 20 }