Dart 中 List 数组的方法还是比较多的,这里我按照 CRUD 对这些方法进行分类汇总。其中 CRUD 指的是增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。
文章目录
- 一:"增加"数据的方法(4 个)
- 二:"删除"数据的方法(6 个)
- 三:"修改"数据的方法(5 个)
- 四:"查询"数据的方法(20 个)
- 五:"常用"的方法(12 个)
一:"增加"数据的方法(4 个)
add 添加一个元素到数组末尾
List<String> l1 = ["周一", "周二", "周三"];
l1.add("周四");
l1.add("周五");
print(l1); // [周一, 周二, 周三, 周四, 周五]
addAll 合并两个数组
List<String> l1 = ["周一", "周二", "周三"];
List<String> l2 = ["周四", "周五", "周六","周日"];
l1.addAll(l2);
print(l1); // [周一, 周二, 周三, 周四, 周五, 周六, 周日]
insert 在指定索引处插入一个值
List<String> l1 = ["周一", "周二", "周三"];
l1.insert(3, "周四");
print(l1); // [周一, 周二, 周三, 周四]
l1.insert(0, "周日");
print(l1); // [周日, 周一, 周二, 周三, 周四]
insertAll 在指定索引处插入一个数组
List<String> l1 = ["周一", "周二", "周三"];
List<String> l2 = ["周四", "周五", "周六", "周日"];
l1.insertAll(0, l2);
print(l1); // [周四, 周五, 周六, 周日, 周一, 周二, 周三]
二:"删除"数据的方法(6 个)
remove 删除指定元素
List<String> l1 = ["周一", "周二", "周三","周一"];
l1.remove("周一");
print(l1); // [周二, 周三, 周一]
removeAt 删除指定索引位置处的元素
List<String> l1 = ["周一", "周二", "周三"];
l1.removeAt(0);
print(l1); // [周二, 周三]
removeLast 删除数组的最后一个元素
List<String> l1 = ["周一", "周二", "周三"];
l1.removeLast();
print(l1); // [周一, 周二]
clear 清空数组
List<String> l1 = ["周一", "周二", "周三"];
l1.clear();
print(l1); // []
removeWhere 根据指定条件删除元素
List<String> l1 = ["周一", "周二", "周三"];
l1.removeWhere((e) => e == "周二");
print(l1); // [周一, 周三]
List<String> l2 = ["周一", "周二", "周三","星期四"];
l2.removeWhere((e) => e.contains("周"));
print(l2); // [星期四]
关于以上删除元素的方法
- 如果数组中有该数据或者满足删除的条件,则删除,原数组发生改动。
- 如果要删除的数据不在数组中,或者删除元素的条件不成立,也不会报错,返回原数组。
removeRange 删除指定索引范围内的元素(含头不含尾)
List<String> l1 = ["周一", "周二", "周三","周四", "周五", "周六", "周日"];
l1.removeRange(2, 5);
print(l1); // [周一, 周二, 周六, 周日]
三:"修改"数据的方法(5 个)
List [index] 修改指定索引位置元素的值
List<String> l1 = ["周一", "周二", "周三", "星期四"];
l1[3] = "周四";
print(l1); // [周一, 周二, 周三, 周四]
fillRange 用相同的值替换指定索引范围内的所有元素(含头不含尾)
List<String> l1 = ["周一", "周二", "周三", "周四", "周五"];
l1.fillRange(1, 4, "AllenSu");
print(l1); // [周一, AllenSu, AllenSu, AllenSu, 周五]
replaceRange 用某一数组替换指定索引范围内的所有元素(含头不含尾)
List<String> l1 = ["周一", "周二", "周三"];
l1.replaceRange(1, 2, ["周四", "周五", "周六", "周日"]);
print(l1); // [周一, 周四, 周五, 周六, 周日, 周三]
List<String> l2 = ["周一", "周二", "周三", "周四", "周五"];
l2.replaceRange(0, 4, ["周六", "周日"]);
print(l2); // [周六, 周日, 周五]
setRange 范围替换数组中的值(含头不含尾)
List<String> l1 = ["11", "22", "33"];
List<String> l2 = ["aa", "bb", "cc"];
l1.setRange(0, 2, l2); // 用 l2 数组中索引为 0 1 位置处元素的值,替换掉 l1 数组中索引 0 1 位置处元素的值
print(l1); // [aa, bb, 33]
setAll 从指定索引位置开始,使用第二个数组内的元素依次替换掉第一个数组中的元素
List<String> l1 = ["周一", "周二", "周三", "周四"];
List<String> l2 = ["周五", "周六", "周日"];
l1.setAll(1, l2);
print(l1); // [周一, 周五, 周六, 周日]
注意: index + l2.length <= l1.length
,否则会报错。
四:"查询"数据的方法(20 个)
elementAt 获取指定索引位置处的元素
List<String> l1 = ["周一", "周二", "周三", "周四"];
String str = l1.elementAt(2);
print(str); // 周三
contains 判断数组中是否含有指定元素
List<String> l1 = ["周一", "周二", "周三", "周四"];
bool a = l1.contains("周一");
bool b = l1.contains("周日");
print(a); // true
print(b); // false
indexOf 获取指定元素在数组中的索引
List<String> l1 = ["周一", "周二", "周三", "周四", "周三"];
int a = l1.indexOf("周三"); // 获取数组中第一次出现"周三"元素的索引
int b = l1.indexOf("周三", 3); // 从索引为3开始,查找第一次出现"周三"元素的索引
int c = l1.indexOf("周日");
print(a); // 2
print(b); // 4
print(c); // -1,数组中不存在指定元素,返回 -1
lastIndexOf 从后向前查找指定元素在数组中的索引
List<String> l1 = ["周一", "周二", "周三", "周四", "周三"];
int a = l1.lastIndexOf("周三");
int b = l1.lastIndexOf("周三", 3);
int c = l1.lastIndexOf("周日");
print(a); // 4
print(b); // 2
print(c); // -1
indexWhere 返回第一个满足条件的元素的索引
List<String> l1 = ["周一", "周二", "周三", "周四", "周三"];
int a = l1.indexWhere((e) => e == "周三");
print(a); // 2
lastIndexWhere 从后向前找,返回第一个满足条件的元素的索引
List<String> l1 = ["周一", "周二", "周三", "周四", "周三"];
int a = l1.lastIndexWhere((e) => e == "周三");
print(a); // 4
where 根据指定条件,函数筛选每个元素,符合条件的元素组成一个新的 Iterable
List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
Iterable<int> l2 = l1.where((e) => e > 10);
print(l2); // (12, 17, 33)
List<int> l3 = l1.where((e) => e >= 10).toList();
print(l3); // [12, 17, 33]
firstWhere 返回第一个满足条件的元素
List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
int a = l1.firstWhere((e) => e > 10);
print(a); // 12
lastWhere 从后向前查找第一个满足条件的元素
List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
int a = l1.lastWhere((e) => e > 10);
print(a); // 33
singleWhere 获取满足指定条件的唯一元素
List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
int a = l1.singleWhere((e) => e > 30);
int b = l1.singleWhere((e) => e > 33, orElse: () => -1);
int c = l1.singleWhere((e) => e > 10, orElse: () => null);
print(a); // 33
print(b); // -1。数组中没有满足条件的元素,返回 orElse 方法指定的返回值(-1是自己填的,你也可以设置为其它值)
print(c); // 报错。当数组中有多个满足条件的元素时,即使你设置了 orElse 的返回值,用 singleWhere 也会报错
retainWhere 保留满足条件的元素(改变了原数组)
List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
l1.retainWhere((e) => e > 10);
print(l1); // [12, 17, 33]
any 判断数组中是否有满足指定条件的元素
List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
bool a = l1.any((e) => e > 30);
print(a); // true
every 判断数组中是否每个元素都满足指定的条件
List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
bool a = l1.every((e) => e > 1);
print(a); // false
take 从索引 0 位置处,取指定个数的元素
List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
Iterable<int> l2 = l1.take(3);
print(l2); // (8, 12, 4)
takeWhile 从索引 0 位置处,查询满足指定条件的元素,直到出现第一个不符合条件的元素,然后返回前面符合条件的元素
List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
Iterable<int> l2 = l1.takeWhile((e) => e > 1);
print(l2); // (8, 12, 4)
skip 跳过指定个数的元素,返回后面的元素
List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
Iterable<int> l2 = l1.skip(4);
print(l2); // (17, 33, 10)
skipWhile 根据指定条件,找到第一个不符合条件的元素,然后将该元素后面的所有元素返回
List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
Iterable<int> l2 = l1.skipWhile((e) => e < 17);
print(l2); // (17, 33, 10)
sublist 从指定索引处截取数组
List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
List<int> l2 = l1.sublist(5);
print(l2); // [33, 10]
List<int> l3 = l1.sublist(2, 5);
print(l3); // [4, 1, 17] 含头不含尾
getRange 截取指定索引范围内的元素
List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
Iterable<int> l2 = l1.getRange(2,5);
print(l2); // (4, 1, 17)
whereType 从混合类型的数组中,筛选出指定类型的元素
List l1 = ["a", 15, "b", false, true, 20, "c",{"name":"AllenSu"}];
Iterable<String> l2 = l1.whereType();
Iterable<int> l3 = l1.whereType();
Iterable<bool> l4 = l1.whereType();
Iterable<Map> l5 = l1.whereType();
print(l2); // (a, b, c)
print(l3); // (15, 20)
print(l4); // (false, true)
print(l5); // ({name: AllenSu})
五:"常用"的方法(12 个)
forEach 遍历数组中的元素
List<int> l1 = [8, 12, 4, 1];
l1.forEach((e) => print(e)); // 8 12 4 1
map 遍历数组中的所有元素,可以对元素进行处理,并返回新的 Iterable
List<int> l1 = [8, 12, 4, 6, 22, 34, 10];
Iterable<bool> l2 = l1.map((e) => e > 10);
Iterable<String> l3 = l1.map((e) => e > 10 ? "大" : "小");
Iterable<num> l4 = l1.map((e) => e > 12 ? e / 2 : e * 2);
print(l2); // (false, true, false, false, true, true, false)
print(l3); // (小, 大, 小, 小, 大, 大, 小)
print(l4); // (16, 24, 8, 12, 11.0, 17.0, 20)
toSet 将 List 转换为 Set,得到去重后的元素
List<int> l1 = [8, 12, 8, 6, 22, 12, 10];
Set<int> l2 = l1.toSet();
print(l2); // {8, 12, 6, 22, 10}
asMap 将 List 转换为 Map,key 为原数组的索引,value 为原数组的元素
List<String> l1 = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"];
Map map = l1.asMap();
print(map); // {0: 周一, 1: 周二, 2: 周三, 3: 周四, 4: 周五, 5: 周六, 6: 周日}
sort 数组排序(原数组发生改变)
List<int> l1 = [8, 12, 8, 6, 22, 12, 10];
l1.sort();
List<String> l2 = ["f","d","b","c","a","e"];
l2.sort();
print(l1); // [6, 8, 8, 10, 12, 12, 22]
print(l2); // [a, b, c, d, e, f]
join 用指定字符连接数组中每个元素,返回 String
List<int> l1 = [8, 12, 8, 6, 22, 12, 10];
String str1 = l1.join();
String str2 = l1.join("");
String str3 = l1.join(" ");
String str4 = l1.join(",");
String str5 = l1.join("-");
print(str1); // 81286221210
print(str2); // 81286221210
print(str3); // 8 12 8 6 22 12 10
print(str4); // 8,12,8,6,22,12,10
print(str5); // 8-12-8-6-22-12-10
cast 将一个数组的类型传递给未指定数据类型的数组
List<int> l1 = [8, 12, 8];
var l2 = l1.cast(); // 指定 l2 的数据类型和 l1 的一样,都是 int 类型
l2.add(6);
print(l1); // [8, 12, 8, 6]
l2.add("ddd");
print(l1); // 报错,提示无法将 String 类型的数添加到 int 类型的数组中
List.generate 快速生产 Flutter 中的 Widget
List<int> l1 = [8, 12, 8, 6, 22, 12, 10];
...
children: List.generate(l1.length, (index){
return Text("$index");
})
reduce 用指定的函数方式对数组中的所有元素做连续操作,并将结果返回
List<int> l1 = [1, 2, 3, 4];
int res1 = l1.reduce((a, b) => (a * b)); // 元素依次相乘
int res2 = l1.reduce((a, b) => (a + b)); // 元素依次相加
print(res1); // 1*2*3*4 = 24
print(res2); // 1+2+3+4 = 10
fold 根据一个现有数组和一个初始参数值 initValue,指定参数条件操作现有数组的所有元素,并返回处理的结果
List<int> l1 = [1, 2, 3, 4];
// 2 为初始参数值,后面定义的方法为该初始值和原数组之间的处理方式
int res1 = l1.fold(2, (a, b) => (a * b)); // 相乘
int res2 = l1.fold(2, (a, b) => (a + b)); // 相加
print(res1); // 2*(1*2*3*4) = 48
print(res2); // 2+(1+2+3+4) = 12
expand 根据现有数组,指定一个处理方式,返回一个 Iterable
List<int> l1 = [1, 2, 3, 4];
// 将 l1 数组内的每一个元素都和指定的表达式组相操作
Iterable<int> l2 = l1.expand((e) => [e + 1]);
Iterable<int> l3 = l1.expand((e) => [e + 1, e + 2]);
Iterable<int> l4 = l1.expand((e) => [e + 2, e * 2]);
Iterable<num> l5 = l1.expand((e) => [e * 2, e / 2]);
Iterable<int> l6 = l1.expand((e) => [e, e + 1, e + 2]);
print(l2); // (2, 3, 4, 5)
print(l3); // (2, 3, 3, 4, 4, 5, 5, 6)
print(l4); // (3, 2, 4, 4, 5, 6, 6, 8)
print(l5); // (2, 0.5, 4, 1.0, 6, 1.5, 8, 2.0)
print(l6); // (1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6)
shuffle 随机排列指定数组(修改了原数组)
List<int> l1 = [1, 2, 3, 4];
l1.shuffle();
print(l1); // [1, 4, 2, 3]
l1.shuffle();
print(l1); // [2, 1, 3, 4]
终于写完了,属实不易,可以看到 Dart 中 List 数组中的方法还是比较多的,其中关于查询数据的居多,虽然每个方法都举了一个或者多个例子,不过我觉得还是缺一张总览表,用来记载每个方法的名称和作用,也给大家整理好了,就是下面这几张表了
汇总
"添加"数据的方法
方法名 | 作用 |
add | 添加一个元素到数组末尾 |
addAll | 合并两个数组 |
insert | 在指定索引处插入一个值 |
insertAll | 在指定索引处插入一个数组 |
"删除"数据的方法
方法名 | 作用 |
remove | 删除指定元素 |
removeAt | 删除指定索引位置处的元素 |
removeLast | 删除数组的最后一个元素 |
clear | 清空数组 |
removeWhere | 根据指定条件删除元素 |
removeRange | 删除指定索引范围内的元素(含头不含尾) |
"修改"数据的方法
方法名 | 作用 |
List [index] | 修改指定索引位置元素的值 |
fillRange | 用相同的值替换指定索引范围内的所有元素(含头不含尾) |
replaceRange | 用某一数组替换指定索引范围内的所有元素(含头不含尾) |
setRange | 范围替换数组中的值(含头不含尾) |
setAll | 从指定索引位置开始,使用第二个数组内的元素依次替换掉第一个数组中的元素 |
"查询"数据的方法
方法名 | 作用 |
elementAt | 获取指定索引位置处的元素 |
contains | 判断数组中是否含有指定元素 |
indexOf | 获取指定元素在数组中的索引 |
lastIndexOf | 从后向前查找指定元素在数组中的索引 |
indexWhere | 返回第一个满足条件的元素的索引 |
lastIndexWhere | 从后向前找,返回第一个满足条件的元素的索引 |
where | 根据指定条件,函数筛选每个元素,符合条件的元素组成一个新的 Iterable |
firstWhere | 返回第一个满足条件的元素 |
lastWhere | 从后向前查找第一个满足条件的元素 |
singleWhere | 获取满足指定条件的唯一元素 |
retainWhere | 根据指定条件筛选元素(改变了原数组) |
any | 判断数组中是否有满足指定条件的元素 |
every | 判断数组中是否每个元素都满足指定的条件 |
take | 从索引 0 位置处,取指定个数的元素 |
takeWhile | 从索引 0 位置处,查询满足指定条件的元素,直到出现第一个不符合条件的元素,然后返回前面符合条件的元素 |
skip | 跳过指定个数的元素,返回后面的元素 |
skipWhile | 根据指定条件,找到第一个不符合条件的元素,然后将该元素后面的所有元素返回 |
sublist | 从指定索引处截取数组 |
getRange | 截取指定索引范围内的元素 |
whereType | 从混合类型的数组中,筛选出指定类型的元素 |
"常用"的方法
方法名 | 作用 |
forEach | 遍历数组中的元素 |
map | 遍历数组中的所有元素,可以对元素进行处理,并返回新的 Iterable |
toSet | 将 List 转换为 Set,得到去重后的元素 |
asMap | 将 List 转换为 Map,key 为原数组的索引,value 为原数组的元素 |
sort | 数组排序(原数组发生改变) |
join | 用指定字符连接数组中每个元素,返回 String |
cast | 将一个数组的类型传递给未指定数据类型的数组 |
List.generate | 快速生产 Flutter 中的 Widget |
reduce | 用指定的函数方式对数组中的所有元素做连续操作,并将结果返回 |
fold | 根据一个现有数组和一个初始参数值 initValue,指定参数条件操作现有数组的所有元素,并返回处理的结果 |
expand | 根据现有数组,指定一个处理方式,返回一个 Iterable |
shuffle | 随机排列指定数组(修改了原数组) |
至此,关于 Dart 中 List 数组的常用方法已经总结完毕,显示已接近一万字,这篇文章实在是太肝了,不过整理下来自己也掌握了很多