Flutter 中 List 用法大全

前言

1
FlutterList 为最常用的类,其基本操作必须得了解

1、赋值与填充

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
List list = List.from(['a', 'b', 'c', 'd']);
print(list); // 输出 [a, b, c, d]

list = ['a', 'b', 'c', 'd'];
print(list); // 输出 [a, b, c, d]

list = List.generate(5, (index) => index * index);
print(list); // 输出 [0, 1, 4, 9, 16]

/// 注意,这种 filled 方法初始化的 list,不能调用 addAll 方法
list = List.filled(5, 'a');
print(list); // 输出 [a, a, a, a, a]

/// Unsupported operation: Cannot add to a fixed-length list
list.addAll(['e', 'g']); // 会报异常

/// 尽管 addAll 不行,但可以使用 fillRange 填充
list.fillRange(1, 3, 'b');
print(list); // 输出 [a, b, b, a, a]

  • List 的初始化方法有多种,唯一要注意的是 filled 初始化后不能直接 addAll

2、查找

1
2
3
4
5
6
7
8
List list = ['a', 'b', 'c', 'd', 'e', 8, 8, 'e'];
print(list.indexOf(8)); // 输出 5
print(list.lastIndexOf(8)); // 输出 6
print(list.indexWhere((e) => e == 'e')); // 输出 4
print(list.lastIndexWhere((e) => e == 'e')); // 输出 7
print(list.firstWhere((e) => e == 'e')); // 输出 e
print(list.lastWhere((e) => e == 'e')); // 输出 e

  • List 在查找时注意带不带 index,带 index 则是找位置

3、插入

1
2
3
4
5
6
7
8
9
10
11
12
List list = ['a', 'b', 'c', 'd', 'e'];
list.insert(3, 'x');
print(list); // 输出 [a, b, c, x, d, e]

list = ['a', 'b', 'c', 'd', 'e'];
list.insertAll(3, ['z', 'z', 'z']);
print(list); // 输出 [a, b, c, z, z, z, d, e]

list = ['a', 'b', 'c', 'd', 'e'];
list.addAll(['z', 'z']);
print(list); // 输出 [a, b, c, d, e, z, z]

  • List 在插入时注意插入的位置,插入后,原 index 位置的元素会向后挪

4、删除

1
2
3
4
5
6
7
8
9
10
11
12
List list = ['a', 'b', 'c', 'd', 'a', 'a'];
list.remove('a');
print(list); // 输出 [b, c, d, a, a]

list = ['a', 'b', 'c', 'd', 'a', 'a'];
list.removeAt(1);
print(list); // 输出 [a, c, d, a, a]

list = ['a', 'b', 'c', 'd', 'a', 'a'];
list.removeRange(2, 4);
print(list); // 输出 [a, b, a, a]

  • List 在删除时要注意是删除位置还是删除元素

5、替换

1
2
3
4
5
6
7
8
9
10
11
12
13
List list = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
list.replaceRange(2, 5, ['x', 'x']);
print(list); // 输出 [a, b, x, x, f, g]

list = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
list.setAll(3, ['x', 'x', 'x']);
print(list); // 输出 [a, b, c, x, x, x, g]

list = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
List temp = ['x', 'y', 'y', 'x'];
list.setRange(2, 4, temp, 1);
print(list); // 输出 [a, b, y, y, e, f, g]

  • List 在替换时,要注意位置及是否跳过

6、排序

1
2
3
4
5
6
7
8
9
10
List list = [1, 2, 3, 4, 5, 6, 7, 8];
list.shuffle();
print(list); // 输出 [4, 5, 3, 6, 8, 2, 7, 1]

list.sort();
print(list); // 输出 [1, 2, 3, 4, 5, 6, 7, 8]

list.sort((x, y) => y - x);
print(list); // 输出 [8, 7, 6, 5, 4, 3, 2, 1]

  • List 在排序时,注意是倒序还是正序

7、检查和判断

1
2
3
4
5
List list = [1, 3, 5, 7, 9, 11];
print(list.contains(2)); // 输出 false
print(list.elementAt(2)); // 输出 5
print(list.every((e) => e % 2 == 1)); // 输出 true

  • List 在排序时,注意是倒序还是正序

8、展开和拼接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
List list = [ [1, 2], [3, 4] ];
print(list.expand((e) => e).toList()); // 输出 [1, 2, 3, 4]

list = [1, 2, 3];
print(list.expand((e) => [e, e]).toList()); // 输出 [1, 1, 2, 2, 3, 3]

/// fold,类似于 JavaScript 中的 reduce()
final intArray = <int>[1, 2, 3];
print(intArray.fold<int>(5, (prev, e) => prev + e)); // 输出 11

/// 拼接
list = [1, 2, 3];
print(list.followedBy([8, 8]).toList()); // 输出 [1, 2, 3, 8, 8]

/// 拼接
list = [1, 2, 3];
print(list.join('+')); // 输出 1+2+3

  • List 在拼接时,注意 expand 的灵活运用

9、遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/// ForEach 遍历,不让用,推荐用 for 循环
List list = [1, 2, 3, 4];
list.forEach((e) => print(e)); // 输出 1 2 3 4,作 4 行显示

/// Map 遍历,与 ForEach 区别是有返回值
list = [1, 2, 3, 4];
List mapList = list.map((e) => e * 2).toList();
print(mapList); // 输出 [2, 4, 6, 8]

/// Reduce,展开对每个元素进行遍历。与 fold 类似,但 fold 有初始值
list = [1, 2, 3, 4];
print(list.reduce((value, e) => value + e)); // 输出 10

/// fold,类似于 JavaScript 中的 reduce(),展开计算,有初始值
final ints = <int>[1, 2, 3];
print(ints.fold<int>(5, (prev, e) => prev + e));

  • List 在遍历时,注意 forEach 一般不推荐

10、截取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/// 跳过,截取后面
list = [1, 2, 3, 4, 5, 6, 7, 8];
print(list.skip(4).toList()); // 输出 [5, 6, 7, 8]
print(list.skipWhile((value) => value != 4).toList()); // 输出 [4, 5, 6, 7, 8]

/// 截取前边
list = [1, 2, 3, 4, 5, 6, 7, 8];
print(list.take(4).toList()); // 输出 [1, 2, 3, 4]
print(list.takeWhile((value) => value != 4).toList()); // 输出 [1, 2, 3]

/// 截取中间
list = [1, 2, 3, 4, 5, 6, 7, 8];
print(list.sublist(2, 5)); // 输出 [3, 4, 5]

/// 截取中间
list = [1, 2, 3, 4, 5, 6, 7, 8];
print(list.getRange(2, 5).toList()); // 输出 [3, 4, 5]

/// 筛选,保留偶数
list = [1, 2, 3, 4, 5, 6, 7, 8];
list.retainWhere((e) => e % 2 == 0);
print(list); // 输出 [2, 4, 6, 8]

/// 筛选,保留偶数
list = [1, 2, 3, 4, 5, 6, 7, 8];
print(list.where((e) => e % 2 == 0).toList()); // 输出 [2, 4, 6, 8]

/// 筛选,保留数字
list = [1, 2, 3, 4, 'a', 'b', 'c'];
print(list.whereType<int>().toList()); // 输出 [1, 2, 3, 4]

  • List 的截取方法很多,注意灵活运用

后记

  • 以下为 ChatGPT 3.5 给出的问题回答
  • 问:flutter 中的 list 有哪些方法,我要全部方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
以下是 Dart 中 List 类的一些常用方法的列表。请注意,这里提供的方法只是其中一部分,
Dart 中的 List 类还具有其他方法,您可以查阅官方文档以获取完整的方法列表:

add(): 向列表末尾添加元素。
addAll(): 将另一个列表的元素添加到当前列表末尾。
clear(): 清空列表中的所有元素。
fillRange(): 将指定范围内的元素设置为特定值。
insert(): 在指定索引位置插入元素。
insertAll(): 在指定索引位置插入另一个列表的元素。
remove(): 删除列表中的指定元素。
removeAt(): 删除指定索引位置的元素。
removeLast(): 删除列表中的最后一个元素。
removeRange(): 删除指定范围内的元素。
removeWhere(): 根据条件删除元素。
retainWhere(): 根据条件保留元素,删除不符合条件的元素。
replaceRange(): 替换指定范围内的元素。
indexOf(): 查找元素在列表中的索引位置。
lastIndexOf(): 查找元素在列表中的最后一个索引位置。
firstWhere(): 查找第一个满足条件的元素。
lastWhere(): 查找最后一个满足条件的元素。
singleWhere(): 查找唯一一个满足条件的元素。
sort(): 对列表中的元素进行排序。
shuffle(): 随机打乱列表中的元素顺序。
asMap(): 返回一个以元素索引为键的映射。
sublist(): 获取列表中一部分元素的子列表。
getRange(): 获取指定范围内的元素的迭代器。
setAll(): 用另一个列表的元素替换指定索引位置的元素。
setRange(): 用另一个列表的元素替换指定范围内的元素。
replaceRange(): 替换指定范围内的元素。
any(): 检查是否有元素满足条件。
every(): 检查是否所有元素都满足条件。
forEach(): 遍历列表中的所有元素并执行指定操作。
isEmpty: 检查列表是否为空。
isNotEmpty: 检查列表是否不为空。
length: 获取列表的长度。
join(): 将列表中的元素以指定分隔符连接为字符串。
toString(): 返回表示列表的字符串。
这些方法允许您在 Dart 中有效地操作列表。您可以根据您的需求选择适当的方法来处理您的列表数据。
  • 问:那 expand() 方法呢
1
2
3
4
5
6
7
8
9
10
11
在 Dart 中,expand() 方法并不是 List 类的方法,而是一个 Iterable 类型的方法。
您可以在 List 或其他可迭代对象上使用 expand() 方法,以展开嵌套的可迭代对象。以下是 expand() 方法的示例:

List<List<int>> nestedList = [[1, 2], [3, 4], [5, 6]];
List<int> flatList = nestedList.expand((list) => list).toList();
// flatList 现在为 [1, 2, 3, 4, 5, 6]
在上面的示例中,nestedList 是一个包含多个整数列表的嵌套列表。
使用 expand() 方法,我们将嵌套的列表展开为一个平面的列表,将所有元素组合在一起。

请注意,expand() 方法返回一个新的可迭代对象,因此我们在示例中使用 toList() 来将其转换为 List 类型。
这使我们可以将嵌套的结构转化为一个平面的列表。
  • 问:那能例出 Iterable 的所有方法吗?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
在 Dart 中,Iterable 是一个抽象类,用于表示可迭代对象,例如 List、Set、Map 中的值等。
Iterable 类提供了许多方法,用于遍历和操作元素。以下是一些常用的 Iterable 方法的列表:

forEach(): 对可迭代对象的每个元素执行指定操作。

map(): 返回一个新的可迭代对象,其中包含对每个元素应用给定函数的结果。

where(): 返回一个新的可迭代对象,其中包含满足给定条件的元素。

expand(): 返回一个新的可迭代对象,其中包含扁平化嵌套的可迭代对象的元素。

reduce(): 使用指定的函数将可迭代对象中的元素聚合为单个值。

fold(): 使用指定的初始值和函数将可迭代对象中的元素聚合为单个值。

toList(): 将可迭代对象转换为一个 List。

toSet(): 将可迭代对象转换为一个 Set。

any(): 检查是否有元素满足指定条件。

every(): 检查是否所有元素都满足指定条件。

isEmpty: 检查可迭代对象是否为空。

isNotEmpty: 检查可迭代对象是否不为空。

length: 获取可迭代对象的长度。

first: 获取可迭代对象的第一个元素。

last: 获取可迭代对象的最后一个元素。

single: 获取可迭代对象中唯一的元素,如果有多个或没有元素会引发异常。

elementAt(): 获取可迭代对象中指定索引位置的元素。

skip(): 创建一个跳过指定数量元素的新可迭代对象。

take(): 创建一个只包含指定数量元素的新可迭代对象。

skipWhile(): 创建一个从满足指定条件的第一个元素开始的新可迭代对象。

takeWhile(): 创建一个包含满足指定条件的元素的新可迭代对象,直到不满足条件。

这些方法允许您对可迭代对象进行各种操作和遍历。
请注意,这只是一些常见的 Iterable 方法,还有其他方法可用于不同的操作需求。
您可以查阅 Dart 官方文档以获取完整的方法列表和详细信息。


Flutter 中 List 用法大全
http://jxr202.github.io/flutter/flutter_007-bda75f9f6ab0/
作者
Jiang
发布于
2023年10月27日
许可协议