目录
编程中非常常用的集合是List。Dart以 List 对象的形式表示List。一个列表仅仅是对象的有序组。dart:core 库提供的列表类,使创建和列表的操作。
Dart中列表的逻辑表示如下:
- test_list - 是引用集合的标识符。
- 该列表包含值12,13和14保存这些值的存储块称为元素。
- List中的每个元素都由一个称为索引的唯一编号标识。索引从零开始 并向上扩展到n-1,其中 n是List中元素的总数。该索引也称为下标 。
列表可分为
- 固定长度列表
- 可增长的列表
固定长度List
固定长度列表的长度在运行时不能更改。创建固定长度列表的语法如下所示:
- 声明列表
声明固定长度列表的语法如下:
var list_name = new List(initial_size);
上面的语法创建了指定大小的列表。列表不能在运行时增长或缩小。任何调整列表大小的尝试都将导致异常。
- 初始化列表
初始化列表的语法如下所示:
lst_name[index] = value;
例
var lst = new List(3);
lst[0] = 12;
lst[1] = 13;
lst[2] = 11;
print(lst);
输出
[12, 13, 11]
可增长的List
可增长列表的长度可以在运行时更改。声明和初始化可增长列表的语法如下所示:
- 声明列表
var list_name = [val1, val2, val3];
--创建一个列表,包含指定值
或者
var list_name = new List();
--创建一个空列表
- 初始化列表
index / subscript
用于引用应该用值填充的元素。初始化列表的语法如下所示:
例
以下示例显示如何创建3个元素的列表。
var numList = [1,2,3];
print(numList);
输出
[1, 2, 3]
例
以下示例使用 空 List()
构造函数创建零长度列表。 List
类中的 add()
函数用于动态地向列表中添加元素。
var lst = new List();
lst.add(12);
lst.add(13);
print(lst);
它将产生以下输出
[12, 13]
filled()
方法创建List
创建一个 list,每个元素共享相同的值,growable
表示是 list 长度是否可变,默认 false
固定长度
语法
参数
- length - List长度
- fill - 创建List的元素
- growable - List长度是否可变,默认为
false
不可变。可以设置为 true,使List长度可变
例1
var listFilled = new List.filled(3, 0,growable: true);
print(listFilled);
listFilled.add(1);
print(listFilled);
输出
[0, 0, 0]
[0, 0, 0, 1]
例2
var listFilledFalse = new List.filled(3, "t1");
print(listFilledFalse);
输出
注意:
listFilledFalse
是长度不可变的List,向listFilledFalse
中添加数据会导致报错。
例
listFilledFalse.add("t2");
输出:
[VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: Unsupported operation: Cannot add to a fixed-length list
#0 FixedLengthListMixin.add (dart:_internal/list.dart:23:5)
#1 extendableLengthList (package:flutter_app_one/List.dart:37:19)
#2 mainList (package:flutter_app_one/List.dart:3:3)
#3 main (package:flutter_app_one/main.dart:27:3)
#4 _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:240:25)
#5 _rootRun (dart:async/zone.dart:1126:13)
#6 _CustomZone.run (dart:async/zone.dart:1023:19)
#7 _runZoned (dart:async/zone.dart:1518:10)
#8 runZoned (dart:async/zone.dart:1502:12)
#9 _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:232:5)
#10 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:301:19)
#11 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
from()
方法创建List
使用另一个List创建一个新的List
语法
参数
- Iterable elements - 使用的List
- growable - 长度是否可变,默认为
true
可变
例
var listFrom = new List.from(["a1","a2","a3"]);
print(listFrom);
输出
generate()
方法创建List
创建一个元素,每个位置创建一个新对象。
语法
参数
- length - List 长度
- generator - 表达式
- growable - List 长度是否可变,默认为
true
可变
例
var listGenerate1 = new List.generate(5, (index) => index);
print("listGenerate1: ${(listGenerate1)}");
var listGenerate2 = new List.generate(5, (index) => index + 1);
print("listGenerate2: ${(listGenerate2)}");
输出
listGenerate1: [0, 1, 2, 3, 4]
listGenerate2: [1, 2, 3, 4, 5]
List属性
属性 | 描述 |
---|---|
first 属性 | 返回列表中的第一个元素 |
isEmpty 属性 | 如果集合没有元素,则返回true |
isNotEmpty 属性 | 如果集合至少包含一个元素,则返回true |
length 属性 | 返回列表元素个数 |
last 属性 | 返回列表中的最后一个元素 |
reversed 属性 | 以相反顺序返回包含列表值的可迭代对象 |
single 属性 | 检查列表是否只有一个元素并返回它 |
此属性返回列表中的第一个元素。
语法
list.first
例
var listTest = [1,2,3,4,5];
print("list first object is ${(listTest.first)}");
输出
list first object is 1
如果集合没有元素,则返回true。
语法
list.isEmpty
例
var listTest = [1,2,3,4,5];
print("list is empty? ${(listTest.isEmpty)}");
输出
false
如果集合至少包含一个元素,则返回true。
语法
list.isNotEmpty
例
var listTest = [1,2,3,4,5];
print("list is not empty? ${(listTest.isNotEmpty)}");
输出
list is not empty? true
返回列表的元素个数。
语法
list.length
例
var listTest = [1,2,3,4,5];
print("The length of list is ${(listTest.length)}");
输出
The length of list is 5
返回列表中的最后一个元素。
语法
list.last
例
var listTest = [1,2,3,4,5];
print("list last object is ${(listTest.last)}");
输出
list last object is 5
以相反的顺序返回包含列表值的可迭代对象。
语法
list.reversed
例
var listTest = [1,2,3,4,5];
print("The list values in reverse order: ${listTest.reversed}");
输出
The list values in reverse order: (5, 4, 3, 2, 1)
检查列表是否只有一个元素并返回它。
语法
list.single
例
var lst = new List();
lst.add(12);
print("The list has only one element: ${lst.single}");
它将产生以下 输出
The list has only one element: 12
如果List中包含多个元素,则此属性将引发 异常 。以下示例说明了相同的情况:
var lst = new List();
lst.add(12);
lst.add(10);
print(lst.single);
如果列表有多个元素,那么相同的代码将抛出以下 异常
Unhandled exception:
Bad state: Too many elements
#0 List.single (dart:core-patch/growable_array.dart:234)
#1 main (file:///D:/Demos/Boolean.dart:6:13)
#2 _startIsolate.<anonymous closure> (dart:isolatepatch/isolate_patch.dart:261)
#3 _RawReceivePortImpl._handleMessage (dart:isolatepatch/isolate_patch.dart:148)
List方法
1)将元素插入List
方法 | 描述 |
---|---|
add() 方法 | 将指定值添加到列表的结尾 并返回修改的列表对象 |
addAll() 方法 | 将多个指定值添加到列表的结尾 并返回修改的列表对象 |
insert(index,value) 方法 | 将指定值插入到列表的指定位置 并返回修改的列表对象 |
insertAll(index, [value list]) 方法 | 将多个指定值插入到列表的指定位置 并返回修改的列表对象 |
followedBy(Iterable<E> other) 方法 | 向列表末尾追加其他Iterable对象 |
将指定值添加到列表的结尾,并返回修改的列表对象。
语法
返回值类型
返回一个List。
例
var listAdd = [1,2,3,4,5];
listAdd.add(6);
print(listAdd);
输出
[1, 2, 3, 4, 5, 6]
将多个指定值添加到列表的结尾,并返回修改的列表对象。
语法
参数
值列表
返回值类型
返回一个List
例
var listAddAll = [1,2,3,4,5];
listAddAll.addAll([6,7,8]);
print(listAddAll);
输出
[1, 2, 3, 4, 5, 6, 7, 8]
将指定值插入到列表的指定位置,并返回修改的列表对象。
语法
参数
- index - 索引下标(注:不可越界)
- element - 插入List的值
返回值类型
返回一个List
例
var listInsert = ["L1","L2","L3","L4","L5"];
listInsert.insert(1, "L6");
print(listInsert);
输出
[L1, L6, L2, L3, L4, L5]
将多个指定值插入到列表的指定位置,并返回修改的列表对象。
语法
参数
- index - 索引下标(注意:下标不可越界)
- iterable - 要插入的List
返回值类型
返回一个List
例
var listInsertAll = ["L1","L2","L3","L4","L5"];
listInsertAll.insertAll(1, ["6","7","8"]);
print(listInsertAll);
输出
[L1, 6, 7, 8, L2, L3, L4, L5]
向列表末尾追加其他列表。
语法
参数
- Iterable - Iterable对象
返回值类型
Iterable 对象
例
var listFollowedBy = [1,2,3];
Iterable iterableFollowedBy = listFollowedBy.followedBy([4,5,6]);
print("iterableFollowedBy: ${(iterableFollowedBy)}");
输出
iterableFollowedBy: (1, 2, 3, 4, 5, 6)
2)查找列表中的元素
方法 | 描述 |
---|---|
indexOf(element) 方法 | 获取元素第一次出现的位置 |
lastIndexOf(element) 方法 | 获取元素最后一次出现的位置 |
indexWhere((element) => expression,index) 方法 | 获取从index开始满足表达式expression的第一个元素的下标 |
lastIndexWhere((element) => expression,index) 方法 | 获取从index开始满足表达式expression的元素最后一次出现的位置 |
contains(element) 方法 | 返回是否包含某个元素 |
getRange(startIndex, endIndex) 方法 | 获取从startIndex至endIndex包含的元素,返回Iterable接口的对象 |
sublist(startIndex, endIndex) 方法 | 获取从startIndex至endIndex包含的元素,返回list对象 |
elementAt(index) 方法 | 获取在 index 下标的元素 |
every((element) => expression) 方法 | 判断每个元素是否满足表达式 如果都满足则返回 true 否则返回 false |
firstWhere((element) => expression) 方法 | 获取满足表达式的第一个元素 |
lastWhere((element) => expression) 方法 | 获取满足表达式的最后一个元素 |
skip(index) 方法 | 返回从 index 开始的List |
skipWhile((value) => expression) 方法 | 遍历查找List,跳过满足条件的元素 直到找到不满足条件的元素 从不满足条件的元素下标开始输出直到List结束 |
take(index) 方法 | 返回从 0至index-1的List |
takeWhile((value) => expression) 方法 | 遍历查找List,输出满足条件的元素 直到找到不满足条件的元素 不满足的元素后的元素不输出 |
cast<Type>() 方法 | 判断List中所有元素是否是某个类型 |
where((element) => expression) 方法 | 筛选符合条件的 List 元素 |
whereType<Type>() 方法 | 筛选符合类型的 List 元素 |
获取所查找的List元素在List中第一次出现的位置。
语法
参数
- element - 要查找的元素
返回值类型
- 元素下标
- -1(未找到元素时返回)
例
var listSearch1 = ["t1",1,2,"t3",4,5,2];
var resIndexOf1 = listSearch1.indexOf("t3");
var resIndexOf2 = listSearch1.indexOf(3);
var resIndexOf3 = listSearch1.indexOf(2);
print("resIndexOf1: ${(resIndexOf1)}");
print("resIndexOf2: ${(resIndexOf2)}");
print("resIndexOf3: ${(resIndexOf3)}");
输出
resIndexOf1: 3
resIndexOf2: -1
resIndexOf3: 2
获取所查找的List元素在List中最后一次出现的位置。
语法
参数
- element - 要查找的元素
返回值类型
- 元素下标
- -1(未找到元素时返回)
例
var listSearch1 = ["t1",1,2,"t3",4,5,2];
var resLastIndexOf = listSearch1.lastIndexOf(2);
print("resLastIndexOf: ${(resLastIndexOf)}");
输出
resLastIndexOf: 6
获取从index开始满足表达式expression的第一个元素的下标。
语法
参数
- expression - 条件表达式(即筛选条件)
- index - 开始查找的索引下标
返回值类型
- 返回满足条件的第一个元素的下标位置。
- -1(未找到元素时返回)
例
var listSearch1 = ["t1",1,2,"t3",4,5,2];
var resIndexWhere1 = listSearch1.indexWhere((element) => element.toString().startsWith("t"));
var resIndexWhere2 = listSearch1.indexWhere((element) => element.toString().startsWith("t"),1);
var resIndexWhere3 = listSearch1.indexWhere((element) => element.toString().startsWith("t"),4);
print("resIndexWhere1: ${(resIndexWhere1)}");
print("resIndexWhere2: ${(resIndexWhere2)}");
print("resIndexWhere3: ${(resIndexWhere3)}");
输出
resIndexWhere1: 0
resIndexWhere2: 3
resIndexWhere3: -1
获取从index开始满足表达式expression的最后一个元素的下标。
语法
参数
- expression - 条件表达式(即筛选条件)
- index - 开始查找的索引下标
返回值类型
- 返回满足条件的最后一个元素的下标位置
- -1(未找到元素时返回)
例
var listSearch1 = ["t1",1,2,"t3",4,5,2];
var resLastIndexWhere1 = listSearch1.lastIndexWhere((element) => element.toString().startsWith("t"));
var resLastIndexWhere2 = listSearch1.lastIndexWhere((element) => element.toString().startsWith("t"),1);
var resLastIndexWhere3 = listSearch1.lastIndexWhere((element) => element.toString().startsWith("t"),4);
print("resLastIndexWhere1: ${(resLastIndexWhere1)}");
print("resLastIndexWhere2: ${(resLastIndexWhere2)}");
print("resLastIndexWhere3: ${(resLastIndexWhere3)}");
输出
resLastIndexWhere1: 3
resLastIndexWhere2: 0
resLastIndexWhere3: 3
判断List是否包含某个元素
语法
参数
- element - 需要判断是否包含的元素
返回值类型
- true - 包含
- false - 不包含
例
var listSearch1 = ["t1",1,2,"t3",4,5,2];
var resContains1 = listSearch1.contains(4);
var resContains2 = listSearch1.contains(3);
print("resContains1: ${(resContains1)}");
print("resContains2: ${(resContains2)}");
输出
resContains1: true
resContains2: false
获取从startIndex至endIndex包含的元素,返回Iterable接口的对象。
语法
参数
- startIndex - 截取开始下标(包含)
- endIndex - 截取结束下标(不包含)
返回值类型
返回Iterable
对象
例
var listSearch1 = ["t1",1,2,"t3",4,5,2];
var resGetRange = listSearch1.getRange(1, 3);
print("resGetRange:${(resGetRange)},${(resGetRange is List)}");
输出
resGetRange:(1, 2),false
获取从startIndex至endIndex包含的元素,返回List
对象。
语法
参数
- startIndex - 截取开始下标(包含)
- endIndex - 截取结束下标(不包含)
返回值类型
返回 List
对象
例
var listSearch1 = ["t1",1,2,"t3",4,5,2];
var resSubList = listSearch1.sublist(1,4);
print("resSubList:${(resSubList)},${(resSubList is List)}");
输出
resSubList:[1, 2, t3],true
返回所在下标的元素。
语法
参数
- index - 想要查询的下标
返回值类型
所在下标的元素
例
var listSearch1 = ["t1",1,2,"t3",4,5,2];
var resElementAt = listSearch1.elementAt(3);
print("resElementAt: ${(resElementAt)}");
输出
resElementAt: t3
判断List中的每个元素是否符合条件
语法
参数
- expression - 判断List元素的条件表达式
返回值类型
- true - 每个元素都符合条件
- false - 至少一个元素不符合条件
例
var listSearch2 = [1,2,3,4,5];
var resEvery1 = listSearch2.every((element) => element > 2);
var redEvery2 = listSearch2.every((element) => element > 0);
print("resEvery1: ${(resEvery1)}");
print("redEvery2: ${(redEvery2)}");
输出
resEvery1: false
redEvery2: true
返回List中第一个满足条件的元素。
语法
参数
- expression - 判断条件
返回值类型
List中第一个满足条件的元素
例
var listSearch2 = [1,2,3,4,5];
var resFirstWhere = listSearch2.firstWhere((element) => element > 2.5);
print("resFirstWhere: ${(resFirstWhere)}");
输出
resFirstWhere: 3
返回List中满足条件的所有元素中的最后一个元素。
语法
参数
- expression - 表达式
返回值类型
List中满足条件的所有元素中的最后一个元素。
例
var listSearch2 = [1,2,3,4,5];
var resLastWhere = listSearch2.lastWhere((element) => element > 2.5);
print("resLastWhere: ${(resLastWhere)}");
输出
resLastWhere: 5
跳过List中前 x 个元素,返回剩下元素。
语法
参数
- index - 需要跳过的下标数(不包括当前下标)
返回值类型
返回 List
对象
例
var listSearch5 = [1,6,4,5,3,2];
var resSkip = listSearch5.skip(2);
print("resSkip: ${(resSkip)}");
输出
resSkip: (4, 5, 3, 2)
跳过满足表达式的List元素,输出从第一个不满足表达式的List元素直至List结束的剩余List元素。
语法
参数
- expression - 条件表达式
返回值类型
返回 List
对象
例
var listSearch6 = [7,8,9,1,2,3,4,5,6,7,8,9];
var resSkipWhile = listSearch6.skipWhile((value) => value > 4);
print("resSkipWhile: ${(resSkipWhile)}");
输出
resSkipWhile: (1, 2, 3, 4, 5, 6, 7, 8, 9)
获取前 index 个List元素(不包含当前下标)。
语法
参数
- index - 想要获取的元素的下标
返回值类型
返回 List
对象
例
var listSearch6 = [7,8,9,1,2,3,4,5,6,7,8,9];
var resTake = listSearch6.take(2);
print("resTake: ${(resTake)}");
输出
(7, 8)
遍历List,输出元素直至不满足条件。
语法
参数
- expression - 条件表达式
返回值类型
返回 List
对象
例
var listSearch6 = [7,8,9,1,2,3,4,5,6,7,8,9];
var resTakeWhile = listSearch6.takeWhile((value) => value > 4);
print("resTakeWhile: ${(resTakeWhile)}");
输出
(7, 8, 9)
判断List元素是否都是某个类型。
语法
参数
- Type - 类型
返回值类型
如果满足条件,则返回原List;否则,报错。
例
var listSearch1 = ["t1",1,2,"t3",4,5,2];
var listSearch6 = [7,8,9,1,2,3,4,5,6,7,8,9];
var resCat1 = listSearch1.cast<int>();
var resCat2 = listSearch6.cast<int>();
print("resCat2: ${(resCat2)}");
print("resCat1: ${(resCat1)}");
输出
resCat2: [7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: type 'String' is not a subtype of type 'int' in type cast
#0 _CastListBase.[] (dart:_internal/cast.dart:101:46)
#1 ListMixin.elementAt (dart:collection/list.dart:61:33)
#2 ListIterator.moveNext (dart:_internal/iterable.dart:346:26)
#3 StringBuffer.writeAll (dart:core-patch/string_buffer_patch.dart:96:19)
#4 IterableBase.iterableToFullString (dart:collection/iterable.dart:269:14)
#5 ListMixin.toString (dart:collection/list.dart:540:37)
#6 _StringBase._interpolate (dart:core-patch/string_patch.dart:842:19)
#7 listMethodSearch (package:flutter_app_one/List.dart:148:32)
#8 mainList (package:flutter_app_one/List.dart:6:3)
#9 main (package:flutter_app_one/main.dart:27:3)
#10 _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:240:25)
#11 _rootRun (dart:async/zone.dart:1126:13)
#12 _CustomZone.run (dart:async/zone.dart:1023:19)
#13 _runZoned (dart:async/zone.dart:151<…>
返回符合表达式的数组元素。
语法
参数
- expression - 条件表达式
返回值类型
返回符合条件的元素的 List
例
var listWhere = [1,2,3,4,5,6];
var resWhere = listWhere.where((element) => element % 2 == 0);
print("resWhere: ${(resWhere)}");
输出
resWhere: (2, 4, 6)
返回符合类型的 List 元素。
语法
参数
- Type - 需要筛选的元素类型
返回值类型
返回符合类型的元素的 List
例
var listWhereType = [1,2,"v3",4,5,"v6"];
var resWhereType = listWhereType.whereType<String>();
print("resWhereType:${(resWhereType)}");
输出
resWhereType:(v3, v6)
3)修改List
Dart允许修改List中项目的值。换句话说,可以重写列表项的值。以下 示例 说明了相同的情况:
var listModify = [1,2,3,4];
print(listModify);
listModify[0] = 6;
print(listModify);
输出
[1, 2, 3, 4]
[6, 2, 3, 4]
方法 | 描述 |
---|---|
sort([int compare(E a, E b)]) 方法 | List 排序 |
join(separator) 方法 | 将 List 按照拼接符拼接成字符串 |
asMap() 方法 | 将 List 根据下标和对应元素转成 Map |
fillRange(int start, int end, [E fillValue]) 方法 | 根据给定的元素将指定范围的元素覆盖 |
setAll(int index, Iterable<E> iterable) 方法 | 将List中的元素从 index 开始替换, 替换到给定List的长度结束 |
setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) 方法 | 将 List 中元素从 startIndex 开始替换 使用Iterable对象中的第skipCount元素开始,到 endIndex 结束 |
shuffle([Random random]) 方法 | 随机打乱 List |
map<T>(T f(E e)) => MappedIterable<E, T>(this, f) 方法 | 对 List 中每一个元素进行操作 返回Iterable对象 |
expand<T>(Iterable<T> f(E element)) => ExpandIterable<E, T>(this, f) 方法 | 展开 List |
fold<T>(T initialValue, T combine(T previousValue, E element)) 方法 | 把 initialValue 作为初始值, 迭代原数组,返回新的 value |
reduce(E combine(E value, E element)) 方法 | value 为初始值为原始数组第一项, 后面是 combine 返回的项 |
replaceRange(int start, int end, Iterable<E> replacement) 方法 | 删除 start 到 end 的数据插入 replacement |
List 排序。
语法
返回值类型
排序后的List
例
var listSort1 = [2,3,7,1,5,9,0,8,6,4];
listSort1.sort((a, b) => b - a);
print("listSort1: ${(listSort1)}");
var listSort2 = [2,3,7,1,5,9,0,8,6,4];
listSort2.sort();
print("listSort2: ${(listSort2)}");
输出
listSort1: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
listSort2: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
将 List 按照拼接符拼接成字符串。
语法
参数
- separator - 分割符
返回值类型
字符串
例
var listJoin = [1,2,3,4,5];
var resJoin = listJoin.join("-");
print("resJoin: ${(resJoin)}");
输出
resJoin: 1-2-3-4-5
将 List 根据下标和对应元素转成 Map。
语法
返回值类型
返回 Map 对象。
例
var listAsMap = ["v1","v2","v3","v4","v5"];
var mapFromList = listAsMap.asMap();
print("mapFromList: ${(mapFromList)}");
输出
mapFromList: {0: v1, 1: v2, 2: v3, 3: v4, 4: v5}
根据给定的元素将指定范围的元素覆盖。
语法
参数
- start - 开始替换的 index
- end - 结束替换的 index
- fillValue - 替换的元素
返回值类型
List 对象
例1
var listFillRange = ["FR1","FR2","FR3","FR4","FR6","FR7","FR8","FR9"];
listFillRange.fillRange(2, 4, "FR10");
print("listFillRange:${(listFillRange)}");
listFillRange.fillRange(6, 8, "FR68");
print("listFillRange:${(listFillRange)}");
输出
listFillRange:[FR1, FR2, FR10, FR10, FR6, FR7, FR8, FR9]
listFillRange:[FR1, FR2, FR10, FR10, FR6, FR7, FR68, FR68]
注意:
startIndex
和endIndex
均不能超过list.count - 1
例2
var listFillRange = ["FR1","FR2","FR3","FR4","FR6","FR7","FR8","FR9"];
listFillRange.fillRange(6, 9, "FR68");
listFillRange.fillRange(10, 12,"FRError");
print("listFillRange:${(listFillRange)}");
以上代码会输出如下错误:
[VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: RangeError (start): Invalid value: Not in range 0..8, inclusive: 10
#0 RangeError.checkValidRange (dart:core/errors.dart:337:7)
#1 ListMixin.fillRange (dart:collection/list.dart:398:16)
#2 listMethodUpdate (package:flutter_app_one/List.dart:207:17)
#3 mainList (package:flutter_app_one/List.dart:7:3)
#4 main (package:flutter_app_one/main.dart:27:3)
#5 _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:240:25)
#6 _rootRun (dart:async/zone.dart:1126:13)
#7 _CustomZone.run (dart:async/zone.dart:1023:19)
#8 _runZoned (dart:async/zone.dart:1518:10)
#9 runZoned (dart:async/zone.dart:1502:12)
#10 _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:232:5)
#11 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:301:19)
#12 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
将List中的元素从 index 开始替换,替换到给定List的长度结束。
语法
参数
- index - 开始替换的下标
- iterable - 替换的元素
返回值类型
List 对象
例1
var listSetAll = [1,2,3,4,5,6];
listSetAll.setAll(1, [7,8,9]);
print("listSetAll: ${(listSetAll)}");
输出
listSetAll: [1, 7, 8, 9, 5, 6]
注意:
startIndex
+iterable.count - 1
不能超过原数组中最大的下标数
例2
var listSetAll = [1,2,3,4,5,6];
listSetAll.setAll(4, [10,11,12]);
print("listSetAll: ${(listSetAll)}");
以上代码将会输出如下错误:
[VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: RangeError (end): Invalid value: Not in range 4..6, inclusive: 7
#0 RangeError.checkValidRange (dart:core/errors.dart:342:9)
#1 ListMixin.setRange (dart:collection/list.dart:405:16)
#2 List.setAll (dart:core-patch/growable_array.dart:64:7)
#3 listMethodUpdate (package:flutter_app_one/List.dart:213:14)
#4 mainList (package:flutter_app_one/List.dart:7:3)
#5 main (package:flutter_app_one/main.dart:27:3)
#6 _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:240:25)
#7 _rootRun (dart:async/zone.dart:1126:13)
#8 _CustomZone.run (dart:async/zone.dart:1023:19)
#9 _runZoned (dart:async/zone.dart:1518:10)
#10 runZoned (dart:async/zone.dart:1502:12)
#11 _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:232:5)
#12 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:301:19)
#13 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.d<…>
将 List 中元素从 startIndex 开始替换,使用Iterable对象中的第skipCount元素开始,到 endIndex 结束。
语法
参数
- start - 开始替换的下标
- end - 结束替换的下标
- iterable - 替换的iterable对象
- skipCount - 从替换的iterable对象的 skipCount 开始替换
返回值类型
List 对象
例1
var listSetRange1 = ["SR1-0","SR1-1","SR1-2","SR1-3","SR1-4","SR1-5"];
var listSetRange2 = ["SR2-0","SR2-1","SR2-2","SR2-3","SR2-4","SR2-5"];
listSetRange1.setRange(1, 4, listSetRange2, 1);
print("listSetRange1: ${(listSetRange1)}");
输出
listSetRange1: [SR1-0, SR2-1, SR2-2, SR2-3, SR1-4, SR1-5]
注意:
1.endIndex
和startIndex
均不能超过被替换的 List 的最大下标值
2.被替换的元素个数不能超过替换的 List 的元素个数
例2
var listSetRange3 = ["SR3-0","SR3-1","SR3-2","SR3-3","SR3-4","SR3-5","SR3-6","SR3-7","SR3-8","SR3-9"];
var listSetRange4 = ["SR4-0","SR4-1","SR4-2","SR4-3","SR4-4"];
listSetRange3.setRange(8, 11, listSetRange4);
print("listSetRange3: ${(listSetRange3)}");
以上代码输出如下报错:
[VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: RangeError (end): Invalid value: Not in range 8..10, inclusive: 11
#0 RangeError.checkValidRange (dart:core/errors.dart:342:9)
#1 ListMixin.setRange (dart:collection/list.dart:405:16)
#2 listMethodUpdate (package:flutter_app_one/List.dart:223:17)
#3 mainList (package:flutter_app_one/List.dart:7:3)
#4 main (package:flutter_app_one/main.dart:27:3)
#5 _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:240:25)
#6 _rootRun (dart:async/zone.dart:1126:13)
#7 _CustomZone.run (dart:async/zone.dart:1023:19)
#8 _runZoned (dart:async/zone.dart:1518:10)
#9 runZoned (dart:async/zone.dart:1502:12)
#10 _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:232:5)
#11 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:301:19)
#12 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
例3
var listSetRange3 = ["SR3-0","SR3-1","SR3-2","SR3-3","SR3-4","SR3-5","SR3-6","SR3-7","SR3-8","SR3-9"];
var listSetRange4 = ["SR4-0","SR4-1","SR4-2","SR4-3","SR4-4"];
listSetRange3.setRange(1, 8, listSetRange4);
print("listSetRange3: ${(listSetRange3)}");
以上代码输出如下报错:
[VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: Bad state: Too few elements
#0 ListMixin.setRange (dart:collection/list.dart:421:7)
#1 listMethodUpdate (package:flutter_app_one/List.dart:225:17)
#2 mainList (package:flutter_app_one/List.dart:7:3)
#3 main (package:flutter_app_one/main.dart:27:3)
#4 _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:240:25)
#5 _rootRun (dart:async/zone.dart:1126:13)
#6 _CustomZone.run (dart:async/zone.dart:1023:19)
#7 _runZoned (dart:async/zone.dart:1518:10)
#8 runZoned (dart:async/zone.dart:1502:12)
#9 _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:232:5)
#10 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:301:19)
#11 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
随机打乱 List。
语法
返回值类型
List 对象
例
var listShuffle = [1,2,3,4,5,6,7,8,9];
listShuffle.shuffle();
print("listShuffle: ${(listShuffle)}");
输出
listShuffle: [2, 1, 8, 6, 3, 7, 5, 9, 4]
对 List 中每一个元素进行操作,返回Iterable对象。
语法
返回值类型
Iterable 对象
例
var listMap = [1,2,3,4,5];
var resMap = listMap.map((e) => e * 2);
print("resMap: ${(resMap)}");
输出
resMap: (2, 4, 6, 8, 10)
展开 List。
语法
返回值类型
List 对象
例
var listExpand1 = [[1,2],[3,4],[5,6]];
var resExpand1 = listExpand1.expand((element) => element).toList();
print("resExpand1: ${(resExpand1)}");
var listExpand2 = [1,2,3];
var resExpand2 = listExpand2.expand((i) => [i+i]).toList();
print("resExpand2: ${(resExpand2)}");
var listExpand3 = [1,2,3];
var resExpand3 = listExpand3.expand((element) => [element,element]).toList();
print("resExpand3: ${(resExpand3)}");
输出
resExpand1: [1, 2, 3, 4, 5, 6]
resExpand2: [2, 4, 6]
resExpand3: [1, 1, 2, 2, 3, 3]
把 initialValue 作为初始值,迭代原数组,返回新的 value。
语法
例
var listFold = [1,2,3,4,5];
var resFold = listFold.fold(10, (previousValue, element) => previousValue + element);
print("resFold: ${(resFold)}");
输出
resFold: 25
value 为初始值为原始数组第一项,后面是 combine 返回的项。
语法
例
var listReduce = [1,2,3,4,5];
var resReduce = listReduce.reduce((value, element) {
return value * element;
});
print("resReduce: ${(resReduce)}");
输出
resReduce: 120
删除 start 到 end 的数据插入 replacement。
语法
参数
- start - 开始index
- end - 结束 index
- replacement - 插入的元素 List
返回值类型
List 对象
例
var listReplaceRange = [0,1,2,3,4,5];
listReplaceRange.replaceRange(2, 4, [6,7,8,9]);
print("listReplaceRange: ${(listReplaceRange)}");
输出
listReplaceRange: [0, 1, 6, 7, 8, 9, 4, 5]
4)删除List
方法 | 描述 |
---|---|
clear() 方法 | 清除 List 所有元素 |
remove(Object value) 方法 | 删除 List 中指定元素 |
removeAt(int index) 方法 | 删除 List 中指定下标的元素 |
removeRange(int start, int end) 方法 | 删除 List 中指定范围的元素 |
removeWhere(bool test(E element)) 方法 | 删除 List 中满足条件的元素 |
retainWhere(bool test(E element)) 方法 | 删除 List 中不满足条件的元素 |
清除 List 所有元素。
语法
例
var listClear = [1,2,3,4,5];
listClear.clear();
print("listClear: ${(listClear)}");
输出
listClear: []
删除 List 中指定元素。
语法
参数
- value - 元素
返回值类型
List 对象
例
var listRemove = [1,2,3,4,5,3];
listRemove.remove(3);
print("listRemove: ${(listRemove)}");
输出
listRemove: [1, 2, 4, 5, 3]
删除 List 中指定下标的元素。
语法
参数
- index - 需要删除的下标
返回值类型
List 对象
例1
var listRemoveAt = [1,2,3,4,5];
listRemoveAt.removeAt(1);
print("listRemoveAt: ${(listRemoveAt)}");
输出
listRemoveAt: [1, 3, 4, 5]
注意:
下标不能越界。
例2
listRemoveAt.removeAt(7);
print("listRemoveAt: ${(listRemoveAt)}");
以上代码输出如下报错:
[VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: RangeError (index): Invalid value: Not in range 0..3, inclusive: 7
#0 List.[] (dart:core-patch/growable_array.dart:146:60)
#1 List.removeAt (dart:core-patch/growable_array.dart:26:22)
#2 listMethodDelete (package:flutter_app_one/List.dart:273:16)
#3 mainList (package:flutter_app_one/List.dart:8:3)
#4 main (package:flutter_app_one/main.dart:27:3)
#5 _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:240:25)
#6 _rootRun (dart:async/zone.dart:1126:13)
#7 _CustomZone.run (dart:async/zone.dart:1023:19)
#8 _runZoned (dart:async/zone.dart:1518:10)
#9 runZoned (dart:async/zone.dart:1502:12)
#10 _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:232:5)
#11 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:301:19)
#12 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
删除 List 中指定范围的元素
语法
参数
- start - 开始下标
- end - 结束下标
返回值类型
List 对象
例1
var listRemoveRange = [0,1,2,3,4,5];
listRemoveRange.removeRange(1, 3);
print("listRemoveRange: ${(listRemoveRange)}");
输出
listRemoveRange: [0, 3, 4, 5]
注意:
开始下标和结束下标均不能越界。
例2
listRemoveRange.removeRange(4, 7);
print("listRemoveRange: ${(listRemoveRange)}");
以上代码输出如下报错:
[VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: RangeError (end): Invalid value: Only valid value is 4: 7
#0 RangeError.checkValidRange (dart:core/errors.dart:342:9)
#1 List.removeRange (dart:core-patch/growable_array.dart:73:16)
#2 listMethodDelete (package:flutter_app_one/List.dart:281:19)
#3 mainList (package:flutter_app_one/List.dart:8:3)
#4 main (package:flutter_app_one/main.dart:27:3)
#5 _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:240:25)
#6 _rootRun (dart:async/zone.dart:1126:13)
#7 _CustomZone.run (dart:async/zone.dart:1023:19)
#8 _runZoned (dart:async/zone.dart:1518:10)
#9 runZoned (dart:async/zone.dart:1502:12)
#10 _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:232:5)
#11 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:301:19)
#12 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
删除 List 中满足条件的元素。
语法
返回值类型
List 对象
例
var listRemoveWhere = [0,1,2,3,4,5];
listRemoveWhere.removeWhere((element) => element > 2);
print("listRemoveWhere: ${(listRemoveWhere)}");
输出
listRemoveWhere: [0, 1, 2]
删除 List 中不满足条件的元素。
语法
返回值类型
List 对象
例
var listRetainWhere = [0,1,2,3,4,5];
listRetainWhere.retainWhere((element) => element > 2);
print("listRetainWhere: ${(listRetainWhere)}");
输出
listRetainWhere: [3, 4, 5]
5)遍历List
例
var listForIn = [1,2,3,4,5];
for(var item in listForIn) {
print("listForIn - item: ${(item)}");
}
输出
listForIn - item: 1
listForIn - item: 2
listForIn - item: 3
listForIn - item: 4
listForIn - item: 5
例
var listForEach = ["each1","each2","each3","each4","each5"];
listForEach.forEach((element) {
print("element: ${(element)}");
});
输出
element: each1
element: each2
element: each3
element: each4
element: each5