Flutter(Dart)的集合类型List、Set 和 Map

embedded/2025/1/19 7:06:09/

在 Dart(以及 Flutter)中,ListSetMap 是三种常用的集合类型,用于存储和管理多个数据项。每种类型都有其独特的特性和适用场景。下面将详细介绍这三种集合类型及其常用方法。

1. List (列表)

List 是一种有序的集合,允许重复元素,并且可以通过索引访问每个元素。它是最常用的集合类型之一,适用于需要保持元素顺序或频繁随机访问的情况。

创建 List
// 使用构造函数创建空列表
List<String> emptyList = List.empty(growable: true);// 使用字面量语法创建列表
List<int> numbers = [1, 2, 3, 4, 5];// 使用生成器创建列表
List<int> generatedNumbers = List.generate(5, (index) => index * 2);
常用方法
  • add(element): 向列表末尾添加一个元素。
  • addAll(iterable): 将多个元素添加到列表末尾。
  • remove(element): 移除列表中的指定元素(第一个匹配项)。
  • removeAt(index): 根据索引移除元素。
  • clear(): 清空列表中的所有元素。
  • contains(element): 检查列表是否包含某个元素。
  • indexOf(element): 返回首次出现的元素索引,若不存在则返回 -1。
  • lastIndexOf(element): 返回最后一次出现的元素索引。
  • sublist(start, [end]): 返回列表的一个子集。
  • reversed: 返回反转后的迭代器。
  • sort([compare]): 对列表进行排序,可选提供比较函数。
  • where((element) => condition): 过滤出符合条件的元素。
  • map((element) => transform): 对每个元素应用转换函数并返回新列表。
  • expand((element) => iterable): 展开每个元素为多个元素。
  • fold(initialValue, (previousValue, element) => nextValue): 累加计算。
  • reduce((value, element) => value): 类似于 fold,但不需要初始值。
  • forEach((element) => action): 对每个元素执行操作。
  • any((element) => test): 判断是否有任何元素满足条件。
  • every((element) => test): 判断所有元素是否都满足条件。
  • firstWhere((element) => test, {orElse}): 查找第一个满足条件的元素,如果找不到可以提供默认值。
  • lastWhere((element) => test, {orElse}): 查找最后一个满足条件的元素,如果找不到可以提供默认值。
  • singleWhere((element) => test, {orElse}): 查找唯一一个满足条件的元素,如果找不到或找到多个会抛出异常。
示例代码
void main() {List<int> numbers = [1, 2, 3, 4, 5];// 添加元素numbers.add(6);print(numbers); // 输出: [1, 2, 3, 4, 5, 6]// 移除元素numbers.remove(3);print(numbers); // 输出: [1, 2, 4, 5, 6]// 排序numbers.sort();print(numbers); // 输出: [1, 2, 4, 5, 6]// 过滤List<int> evenNumbers = numbers.where((number) => number % 2 == 0).toList();print(evenNumbers); // 输出: [2, 4, 6]
}

2. Set (集合)

Set 是一种无序的集合,不允许重复元素。它非常适合用来去除重复项或进行集合运算(如并集、交集、差集等)。

创建 Set
// 使用构造函数创建空集合
Set<String> emptySet = Set<String>();// 使用字面量语法创建集合
Set<int> uniqueNumbers = {1, 2, 3, 4, 5};// 使用生成器创建集合
Set<int> generatedUniqueNumbers = Set.from(List.generate(5, (index) => index * 2));
常用方法
  • add(element): 添加一个元素(不会重复)。
  • addAll(iterable): 添加多个元素。
  • remove(element): 移除指定元素。
  • clear(): 清空集合。
  • contains(element): 检查集合是否包含某个元素。
  • union(other): 返回两个集合的并集。
  • intersection(other): 返回两个集合的交集。
  • difference(other): 返回当前集合减去另一个集合的结果。
  • lookup(element): 查找元素,如果不存在则返回 null
  • forEach((element) => action): 对每个元素执行操作。
  • map((element) => transform): 对每个元素应用转换函数并返回新集合。
  • where((element) => condition): 过滤出符合条件的元素。
示例代码
void main() {Set<int> setA = {1, 2, 3};Set<int> setB = {3, 4, 5};// 并集Set<int> unionSet = setA.union(setB);print(unionSet); // 输出: {1, 2, 3, 4, 5}// 交集Set<int> intersectionSet = setA.intersection(setB);print(intersectionSet); // 输出: {3}// 差集Set<int> differenceSet = setA.difference(setB);print(differenceSet); // 输出: {1, 2}
}

3. Map (映射表)

Map 是键值对的集合,其中每个键都是唯一的。它非常适合用来表示关联数组或字典结构的数据。

创建 Map
// 使用构造函数创建空映射表
Map<String, int> emptyMap = Map<String, int>();// 使用字面量语法创建映射表
Map<String, int> ages = {'Alice': 30, 'Bob': 25, 'Charlie': 35};// 使用生成器创建映射表
Map<int, String> daysOfWeek = Map.fromIterable(['Monday', 'Tuesday', 'Wednesday'],key: (item) => ['Monday', 'Tuesday', 'Wednesday'].indexOf(item),value: (item) => item,
);
常用方法
  • containsKey(key): 检查映射表是否包含特定键。
  • containsValue(value): 检查映射表是否包含特定值。
  • putIfAbsent(key, () => value): 如果键不存在,则插入键值对。
  • remove(key): 移除指定键及其对应的值。
  • keys: 获取所有键的可迭代对象。
  • values: 获取所有值的可迭代对象。
  • entries: 获取键值对的可迭代对象。
  • forEach((key, value) => action): 对每个键值对执行操作。
  • map((key, value) => entry): 对每个键值对应用转换函数并返回新的映射表。
  • update(key, (value) => updatedValue, {ifAbsent}): 更新现有键的值,如果键不存在可以提供默认值。
  • clear(): 清空映射表中的所有键值对。
示例代码
void main() {Map<String, int> ages = {'Alice': 30, 'Bob': 25, 'Charlie': 35};// 添加或更新键值对ages['David'] = 28;print(ages); // 输出: {'Alice': 30, 'Bob': 25, 'Charlie': 35, 'David': 28}// 移除键值对ages.remove('Bob');print(ages); // 输出: {'Alice': 30, 'Charlie': 35, 'David': 28}// 遍历映射表ages.forEach((name, age) {print('$name is $age years old.');});// 输出:// Alice is 30 years old.// Charlie is 35 years old.// David is 28 years old.
}

总结

ListSetMap 是 Dart 中非常重要的集合类型,各自具有不同的特性和使用场景:

  • List:适合需要保持元素顺序或频繁随机访问的情况。
  • Set:适合用来去除重复项或进行集合运算。
  • Map:适合用来表示关联数组或字典结构的数据。

http://www.ppmy.cn/embedded/155162.html

相关文章

软硬件项目运维管理制度,安全运行维护管理手册(Word原件)

第一章 总则 第二章 运行维护组织架构 第一节 运行维护组织 第二节 职责分工 第三章 运行维护工作基本制度 第一节 故障管理 第二节 问题管理 第三节 变更管理 第四节 巡检管理 第五节 备份及日志管理 第六节 安全保密管理 运行维护管理的基本任务&#…

【华为路由/交换机的ftp文件操作】

华为路由/交换机的ftp文件操作 PC&#xff1a;10.0.1.1 R1&#xff1a;10.0.1.254 / 10.0.2.254 FTP&#xff1a;10.0.2.1 S1&#xff1a;无配置 在桌面创建FTP-Huawei文件夹&#xff0c;里面创建config/test.txt。 点击上图中的“启动”按钮。 然后ftp到server&#xff0c;…

Python学习(十三)什么是模块、模块的引入、自定义模块、常见的内置模块(math、random、os、sys、uuid、时间模块、加密模块)

目录 一、什么是模块&#xff1f;1.1 定义1.2 分类1.3 五种模块引入的方法1&#xff09;import 模块名&#xff08;全部引入&#xff09;2&#xff09;from 模块名 import 功能名&#xff08;部分引入&#xff09;3&#xff09;from 模块名 import *&#xff08;引入公共功能&a…

Ubuntu服务器折腾集

目录 Ubuntu 更改软件源Ubuntu 系统语言英文改中文windows 远程链接 Ubuntu 图形界面Windows 通过 openssh 连接 UbuntuUbuntu linux 文件权限Ubuntu 空闲硬盘挂载到 文件管理器的 other locationsUbuntu 开启 SMB 服务&#xff0c;并通过 windows 访问DockerseafileNextcloud…

《知识图谱:鸿蒙NEXT中人工智能的智慧基石》

在鸿蒙NEXT系统的人工智能应用中&#xff0c;知识图谱技术犹如一座智慧基石&#xff0c;为系统的智能化提供了强大的知识支撑&#xff0c;开启了更智能、更高效、更个性化的交互新时代。 提升语义理解能力 知识图谱以其结构化的知识表示方式&#xff0c;将各种实体和它们之间…

Linux《Linux简介与环境的搭建》

在学习了C或者是C语言的基础知识之后就可以开始Linux的学习了&#xff0c;现在Linux无论是在服务器领域还是在桌面领域都被广泛的使用&#xff0c;所以Linxu也是我们学习编程的重要环节&#xff0c;在此接下来我们将会花大量的时间在Linxu的学习上。在学习Linux初期你可以会像初…

UnityEditor脚本:调用ADB推送文件到手机

因为经常要直接把工程文件推入到手机上跑真机测试&#xff0c;就做了一个&#xff0c;在工程内选中文件&#xff0c;推送到手机的简单脚本。 这里的根据项目需要&#xff0c;按文件的目录结够push进手机&#xff0c;如果只是推buddle&#xff0c;会更简单点&#xff0c;不做拓…

【.net core】【sqlsugar】时间查询示例

1、时间包含查询示例 //model.TimeInterval为时间区间参数&#xff0c;参数格式为2024-01-01~2025-01-01 //query为当前查询的语句内容 //为当前查询语句增加创建时间模糊搜索查询条件 query query.Where(a > ((DateTime)a.F_CreatorTime).ToString("yyyy-MM-dd HH:m…