本节目标
使用 where 过滤分钟数,用 toList 固定结果,再修改原列表,观察查询执行时机与结果一致性。
环境与运行方法
安装 Dart SDK 3.x,将源码保存为 lesson.dart,先执行 dart analyze lesson.dart,再执行 dart run lesson.dart。以下为纯 Dart 控制台示例,不依赖 Flutter。
核心思路
where 产生可迭代视图,通常在消费时才执行筛选。toList 建立当前结果快照。需要重复展示稳定数据时,明确是否物化结果,比假设所有集合操作都会马上执行更可靠。
完整示例
void main() {
final source = [20, -5, 35];
final query = source.where((value) => value >= 0);
final snapshot = query.toList();
source.add(10);
print('query=' + query.length.toString());
print('snapshot=' + snapshot.length.toString());
print('total=' + query.fold<int>(0, (sum, value) => sum + value).toString());
}预期输出
query=3
snapshot=2
total=65逐步理解
query 在最后读取时看到了新增的 10;snapshot 在修改之前创建,只保存两个有效值。fold 从零开始,所以空输入也有明确总和。
final source 仍可 add,因为限制的是名称重新绑定,不是列表内容。需要只读集合时可以选用不可修改视图或副本,同时注意元素若是可变对象仍可能被外部修改。数据一致性应从整个对象关系考虑。
常见问题与边界
- 不要在迭代进行中随意修改集合。
- 对同一个延迟查询多次消费可能重复工作。
- List 副本只保证外层结构复制。
动手练习
把新增值改成 -10,再让原列表为空。
参考答案
新增负数不会进入查询,有效数量仍为 2,总和 55。空列表情况下快照与查询都为空,fold 的初始值使总和为 0。
文章回复
0 条公开回复