DevCN
菜单
全部文章快讯开发科技深度热点

Dart 集合:区分延迟 Iterable 与 List 快照

使用 where 过滤分钟数,用 toList 固定结果,再修改原列表,观察查询执行时机与结果一致性。


本节目标

使用 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。

DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。