【Flutter for OpenHarmony--Dart 入门日记】第4篇:集合类型详解------List 的增删改查与函数式操作
作者 :灰灰勇闯IT
时间 :2026年1月
系列定位 :零基础记录 Dart 学习过程,适合编程新手、Flutter 初学者
本文重点 :掌握List的声明、常用方法(add/remove)、函数式操作(forEach/every/where)及核心属性

目录
- [1. 为什么需要 List?从单个值到多个值](#1. 为什么需要 List?从单个值到多个值)
- [2. List 的基本声明与初始化](#2. List 的基本声明与初始化)
- [3. 增:添加元素(
add与addAll)](#3. 增:添加元素(add 与 addAll)) - [4. 删:删除元素(
remove/removeLast/removeRange)](#4. 删:删除元素(remove / removeLast / removeRange)) - [5. 函数式操作:遍历、判断与筛选](#5. 函数式操作:遍历、判断与筛选)
- [5.1
forEach:对每个元素执行操作](#5.1 forEach:对每个元素执行操作) - [5.2
every:判断是否所有元素都满足条件](#5.2 every:判断是否所有元素都满足条件) - [5.3
where:筛选满足条件的元素](#5.3 where:筛选满足条件的元素)
- [5.1
- [6. List 的常用属性:
length、first、last、isEmpty](#6. List 的常用属性:length、first、last、isEmpty) - [7. 实战综合:班级学生管理系统(简化版)](#7. 实战综合:班级学生管理系统(简化版))
- [8. 常见误区与最佳实践](#8. 常见误区与最佳实践)
- [9. 小结 & 下期预告](#9. 小结 & 下期预告)
1. 为什么需要 List?从单个值到多个值
之前我们学的 String、int、bool 都只能存储一个值 。但在真实场景中,我们经常需要处理一组数据:
- 一个班级的所有学生姓名
- 购物车中的商品列表
- 用户的历史搜索记录
这时候就需要 List(列表) ------ Dart 中最常用的有序集合类型,支持按索引访问、动态增删、批量操作。
🌟 我的理解 :
如果说变量是"一个盒子",那
List就是一排带编号的盒子(0, 1, 2...),可以放任意数量的东西,还能随时加新盒子或扔掉旧盒子。
2. List 的基本声明与初始化
语法:
dart
List<类型> 变量名 = [元素1, 元素2, ...];
示例:存储班级学生
dart
void main() {
List<String> students = ['张三', '李四', '王五'];
print(students); // 输出:[张三, 李四, 王五]
}
✅ 特点:
- 元素类型用
<String>显式声明(推荐!) - 字符串可用单引号或双引号
- 列表内容用方括号
[]包裹
💡 也可以用
var或不指定类型(不推荐):
dartvar students = ['张三', '李四']; // 推断为 List<String>

3. 增:添加元素(add 与 addAll)
✅ add():尾部添加单个元素
dart
students.add('新同学');
print(students); // [张三, 李四, 王五, 新同学]
✅ addAll():尾部批量添加多个元素
dart
students.addAll(['新来的同学一', '新来的同学二']);
print(students);
// 输出:[张三, 李四, 王五, 新同学, 新来的同学一, 新来的同学二]
⚠️ 注意:
addAll()的参数必须是一个 Iterable(如另一个 List)

4. 删:删除元素(remove / removeLast / removeRange)
✅ remove(值):删除第一个匹配的元素
dart
students.add('新同学'); // 现在有两个 "新同学"
students.remove('新同学'); // 只删第一个
print(students); // 第二个 "新同学" 仍在
✅ removeLast():删除最后一个元素(无需参数)
dart
students.removeLast(); // 删除 "新来的同学二"
✅ removeRange(start, end):删除索引范围内的元素
- 索引从 0 开始
- 左闭右开 :包含
start,不包含end
dart
// 删除 "张三"(0) 和 "李四"(1)
students.removeRange(0, 2);
print(students); // [王五, 新同学, 新来的同学一]

5. 函数式操作:遍历、判断与筛选
Dart 的 List 支持现代函数式编程方法,让代码更简洁、语义更清晰。
5.1 forEach:对每个元素执行操作
dart
students.forEach((item) {
print('学生:$item');
});
输出:
学生:王五
学生:新同学
学生:新来的同学一
✅ 适用于:打印、日志、简单处理

5.2 every:判断是否所有元素都满足条件
返回 true 或 false。
dart
bool allStartWithXin = students.every((item) {
return item.toString().startsWith('新');
});
print('所有学生名字都以"新"开头吗?$allStartWithXin'); // false(因为有"王五")
🔍 注意:
item.toString()是为了确保即使元素不是字符串也能安全调用方法(虽然本例中都是 String)

5.3 where:筛选满足条件的元素
返回一个 Iterable ,通常需调用 .toList() 转为新列表。
dart
List<String> newStudents = students.where((item) {
return item.startsWith('新');
}).toList();
print('新同学列表:$newStudents');
// 输出:[新同学, 新来的同学一]
💡 关键点 :
where不修改原列表,而是生成一个新列表,符合不可变编程思想。

6. List 的常用属性:length、first、last、isEmpty
属性 vs 方法:属性不加 ()
dart
void main() {
List<String> list = ['王五', '新同学', '新来的同学一'];
print('长度:${list.length}'); // 3
print('第一个:${list.first}'); // 王五
print('最后一个:${list.last}'); // 新来的同学一
print('是否为空:${list.isEmpty}'); // false
print('是否非空:${list.isNotEmpty}'); // true(常用!)
}
✅ 开发建议 :
在循环前检查
isNotEmpty,避免空列表异常。

7. 实战综合:班级学生管理系统(简化版)
结合所学,我们实现一个简单的管理流程:
dart
void main() {
// 初始化班级
List<String> students = ['张三', '李四', '王五'];
print('初始班级:$students');
// 新生入学
students.addAll(['赵六', '钱七']);
print('新生加入后:$students');
// 转走一名学生
students.remove('李四');
print('李四转学后:$students');
// 找出所有姓"新"的学生(假设我们有)
var xinStudents = students.where((s) => s.startsWith('新')).toList();
if (xinStudents.isNotEmpty) {
print('新同学:$xinStudents');
} else {
print('暂无新同学');
}
// 统计人数
print('当前班级人数:${students.length}');
}
这个小例子涵盖了 声明、增、删、筛、查 全流程!

8. 常见误区与最佳实践
❌ 误区1:"remove(值) 会删除所有匹配项"
→ 只删第一个 !要删全部需循环或用 removeWhere()。
❌ 误区2:"where 返回的是 List"
→ 返回 Iterable,必须 .toList() 才能当列表用。
❌ 误区3:"索引从 1 开始"
→ Dart 所有索引都从 0 开始!
✅ 最佳实践:
- 声明时尽量指定泛型:
List<String>而非List - 使用
isNotEmpty而非length > 0(性能更好) - 优先使用函数式方法(
where,map)而非手动 for 循环 - 删除元素时注意索引变化(
removeRange更高效)
9. 小结 & 下期预告
✅ 本篇收获:
- 学会了
List的声明与初始化 - 掌握了五大操作:
add、addAll、remove、removeLast、removeRange - 理解了三大函数式方法:
forEach(遍历)、every(全满足)、where(筛选) - 熟悉了四大属性:
length、first、last、isEmpty
🎯 动手练习 :
尝试扩展"学生管理系统":
- 添加
clear()清空列表 - 使用
indexOf()查找学生位置 - 用
sort()按姓名排序
➡️ 下期预告 :
《【Dart 入门日记】第5篇:字典类型 Map ------ 键值对的高效存储》
我们将学习如何用 Map 存储"学号-姓名"、"商品ID-价格"等关联数据,为 Flutter 中的状态管理打下坚实基础!
💬 互动时间 :
你在使用 List 时有没有遇到过"删错元素"或"索引越界"的问题?或者你觉得 where 和 every 哪个更实用?欢迎在评论区分享你的经验!如果你觉得这篇文章帮你理清了 List 的用法,别忘了 点赞 + 收藏 + 关注,你的支持是我持续更新的最大动力!
📎 附:所有代码均可直接复制运行
开发环境:Dart SDK 3.0+,推荐使用 VS Code + Dart 插件