Dart中常用的集合类型
- List:列表,有序集合,可以修改数据。Dart中List对应数组,可以通过索引访问元素。
- Set:集合,无序,不可重复。常用于过滤重复数据。
- Map:映射,键值对集合。键必须唯一,值可以重复。常用于存储关联数据。
- Queue:队列,先入先出的集合。
举例
List:
var list = [1, 2, 3]; list.add(4); // [1, 2, 3, 4] list[0]; // 1
Set:
var set = {1, 2, 3}; set.add(2); // {1, 2, 3} 不可重复 set.add(4); // {1, 2, 3, 4}
Map:
var map = {'a': 1, 'b': 2}; map['a']; // 1 map['c'] = 3; // {'a': 1, 'b': 2, 'c': 3}
Queue:
var queue = Queue(); queue.add(1); queue.add(2); queue.removeFirst(); // 1, 返回第一个元素 queue.first; // 2, 获取第一个元素
除此之外,Dart还提供了UnmodifiableListView、SplayTreeSet、LinkedHashMap等集合类型。
Dart的集合类都实现了Iterable接口,所以可以使用许多共同的方法,如forEach()、map()、where()、reduce()等。
这使得Dart的集合操作非常强大和灵活。
集合常用方法
Dart中的集合类型都实现了Iterable接口,所以拥有许多共同的方法,例如:
- forEach(): 用于遍历集合中的每个元素,没有返回值
- map(): 将每个元素转换为新元素,返回转换后的集合
- where(): 过滤集合中的元素,返回符合条件的元素集合
- reduce(): 将集合中的元素组合起来,返回一个单一结果
List例子
下面通过例子详细说明每个方法:
forEach():
var list = [1, 2, 3]; list.forEach(print); // 1 2 3
map():
map()是一个非常有用的Dart集合操作,它允许我们将一个集合中的元素按照转换函数转换为新的形式,这在数据处理和映射中有很广泛的应用。
这是将数据库查询结果映射到Dart模型对象的常用手段。
var list = [1, 2, 3]; var doubled = list.map((x) => x * 2); print(doubled); // [2, 4, 6]
where():
var list = [1, 2, 3, 4]; var even = list.where((x) => x % 2 == 0); print(even); // [2, 4]
reduce():
reduce()是一个极为有用的集合方法,它的作用是:
将集合中的元素组合为一个单一结果。它通过执行一个函数来组合元素,这个函数有两个参数并返回一个新的组合结果。
其语法为:
someCollection.reduce(combineFunction)
- someCollection是要减少的集合,可以是List、Set等
- combineFunction是一个函数,用于组合两个元素并返回结果
- reduce()返回最终的单一结果
例如,数组求和可以使用reduce():
var list = [1, 2, 3]; var sum = list.reduce((a, b) => a + b); print(sum); // 6
这里combineFunction为(a, b) => a + b,它会先以a = 1,b = 2计算,得到结果3;
然后a = 3,b = 3得到结果6,这就是最终reduce()返回的结果。
求最大值也可以使用reduce():
var list = [5, 3, 7, 4]; var max = list.reduce((a, b) => a > b ? a : b); print(max); // 7
这里combineFunction通过比较a和b,返回较大者,经过多次执行最终得到最大值7。
所以,总结来说,.reduce()通过执行一个combineFunction,将集合元素两两组合,最终得到一个单一结果。
这是一个实现数组汇总的非常高效简洁的方式。
它经常用于求和、求最大/最小值、计算乘积等操作。不仅仅限于数值,也可以用于字符串的拼接等
这些方法让Dart的集合操作变得异常强大和灵活:
我们可以轻松遍历和过滤集合
将集合元素映射和转换为新元素
通过reduce()实现求和、求最大值等汇总操作
而这些方法均为Iterable的方法,所以List、Set、Map等所有集合类型都共享这些功能。它们可以帮助我们轻松处理和转换数据,实现各种复杂的业务逻辑。
Set例子
我们来看几个使用Set的例子:
forEach(): 遍历Set中的每个元素
var set = {'a', 'b', 'c'}; set.forEach(print); // a // b // c
map(): 将每个元素转换为新元素,返回Set
var set = {1, 2, 3}; var doubled = set.map((x) => x * 2); print(doubled); // {2, 4, 6}
where(): 过滤Set中的元素,返回符合条件的元素Set
var set = {1, 2, 3, 4}; var even = set.where((x) => x % 2 == 0); print(even); // {2, 4}
reduce(): 对Set中的元素执行组合操作,返回一个结果
var set = {'a', 'b', 'c'}; var concat = set.reduce((x, y) => x + y); print(concat); // abc
以上示例展示了如何对Dart的Set类型使用这些常用的集合方法。
尽管Set是无序和不可重复的,但是它同样拥有强大的集合功能,这使我们可以方便地:
遍历Set中的所有元素
过滤和转换Set中的元素
通过reduce()组合Set中的元素
事实上,由于Set实现了Iterable接口,所以它拥有与List完全相同的集合方法。