【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 插件


相关推荐
时光慢煮2 小时前
打造跨端浮动操作按钮:Flutter × OpenHarmony 实战
flutter·华为·开源·openharmony
ujainu2 小时前
Flutter for OpenHarmonyOS 前置知识:Dart语言详解(下)
flutter·wpf·harmonyos
IT陈图图2 小时前
基于 Flutter × OpenHarmony 的跨端视频播放器数据模型设计实践
flutter·开源·鸿蒙·openharmony
时光慢煮2 小时前
Flutter × OpenHarmony 跨端开发:实现排序与创建选项功能
flutter·华为·开源·openharmony
Miguo94well3 小时前
Flutter框架跨平台鸿蒙开发——养生APP的开发流程
flutter·华为·harmonyos·鸿蒙
雨季6663 小时前
构建交互式响应式页面:Flutter 在 OpenHarmony 上的动态 UI 实践
flutter·ui
IT陈图图3 小时前
构建跨端视频播放器中的“推荐视频”模块:Flutter × OpenHarmony 实战解析
flutter·音视频·鸿蒙·openharmony
IT陈图图3 小时前
Flutter × OpenHarmony 跨端视频播放器实战:自定义视频控制栏设计与实现
flutter·音视频·鸿蒙·openharmony
2501_944521593 小时前
Flutter for OpenHarmony 微动漫App实战:底部导航实现
android·开发语言·前端·javascript·redis·flutter·ecmascript