【Flutter for OpenHarmony--Dart 入门日记】第4篇:集合类型详解——List 的增删改查与函数式操作


【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. 增:添加元素(addaddAll)](#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:筛选满足条件的元素)
  • [6. List 的常用属性:lengthfirstlastisEmpty](#6. List 的常用属性:length、first、last、isEmpty)
  • [7. 实战综合:班级学生管理系统(简化版)](#7. 实战综合:班级学生管理系统(简化版))
  • [8. 常见误区与最佳实践](#8. 常见误区与最佳实践)
  • [9. 小结 & 下期预告](#9. 小结 & 下期预告)

1. 为什么需要 List?从单个值到多个值

之前我们学的 Stringintbool 都只能存储一个值 。但在真实场景中,我们经常需要处理一组数据

  • 一个班级的所有学生姓名
  • 购物车中的商品列表
  • 用户的历史搜索记录

这时候就需要 List(列表) ------ Dart 中最常用的有序集合类型,支持按索引访问、动态增删、批量操作。

🌟 我的理解

如果说变量是"一个盒子",那 List 就是一排带编号的盒子(0, 1, 2...),可以放任意数量的东西,还能随时加新盒子或扔掉旧盒子。


2. List 的基本声明与初始化

语法:

dart 复制代码
List<类型> 变量名 = [元素1, 元素2, ...];

示例:存储班级学生

dart 复制代码
void main() {
  List<String> students = ['张三', '李四', '王五'];
  print(students); // 输出:[张三, 李四, 王五]
}

特点

  • 元素类型用 <String> 显式声明(推荐!)
  • 字符串可用单引号或双引号
  • 列表内容用方括号 [] 包裹

💡 也可以用 var 或不指定类型(不推荐):

dart 复制代码
var students = ['张三', '李四']; // 推断为 List<String>

3. 增:添加元素(addaddAll

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:判断是否所有元素都满足条件

返回 truefalse

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 的常用属性:lengthfirstlastisEmpty

属性 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 的声明与初始化
  • 掌握了五大操作:addaddAllremoveremoveLastremoveRange
  • 理解了三大函数式方法:forEach(遍历)、every(全满足)、where(筛选)
  • 熟悉了四大属性:lengthfirstlastisEmpty

🎯 动手练习

尝试扩展"学生管理系统":

  • 添加 clear() 清空列表
  • 使用 indexOf() 查找学生位置
  • sort() 按姓名排序

➡️ 下期预告

《【Dart 入门日记】第5篇:字典类型 Map ------ 键值对的高效存储》

我们将学习如何用 Map 存储"学号-姓名"、"商品ID-价格"等关联数据,为 Flutter 中的状态管理打下坚实基础!


💬 互动时间

你在使用 List 时有没有遇到过"删错元素"或"索引越界"的问题?或者你觉得 whereevery 哪个更实用?欢迎在评论区分享你的经验!如果你觉得这篇文章帮你理清了 List 的用法,别忘了 点赞 + 收藏 + 关注,你的支持是我持续更新的最大动力!


📎 附:所有代码均可直接复制运行

开发环境:Dart SDK 3.0+,推荐使用 VS Code + Dart 插件


相关推荐
程序员Ctrl喵16 小时前
异步编程:Event Loop 与 Isolate 的深层博弈
开发语言·flutter
前端不太难17 小时前
Flutter 如何设计可长期维护的模块边界?
flutter
小蜜蜂嗡嗡18 小时前
flutter列表中实现置顶动画
flutter
始持19 小时前
第十二讲 风格与主题统一
前端·flutter
始持19 小时前
第十一讲 界面导航与路由管理
flutter·vibecoding
始持19 小时前
第十三讲 异步操作与异步构建
前端·flutter
新镜19 小时前
【Flutter】 视频视频源横向、竖向问题
flutter
黄林晴20 小时前
Compose Multiplatform 1.10 发布:统一 Preview、Navigation 3、Hot Reload 三箭齐发
android·flutter
Swift社区21 小时前
Flutter 应该按功能拆,还是按技术层拆?
flutter
肠胃炎21 小时前
树形选择器组件封装
前端·flutter