Dart中如何按DateTime属性年份将List<DayTasks>拆分为子列表?
按年份拆分
List<DayTasks> 的实现逻辑 整体思路是通过年份值对原列表元素做映射分组,每个分组就是独立的同年份子列表,无需重复判断元素归属。
前置注意事项
由于DayTasks中的_date是私有字段,仅和DayTasks定义在同一Dart库/文件下的代码可直接访问该字段;如果需要跨文件调用分组逻辑,需要在DayTasks类中补充公共的年份访问方法,避免私有属性访问报错:
class DayTasks{ List<Task> _tasks = []; final DateTime _date; // 新增公共getter,仅暴露年份值,不破坏原有类的封装性 int get year => _date.year; }
具体实现
原生无第三方依赖实现
不需要引入额外包,通过遍历列表做分组即可:
// 待拆分的原列表 List<DayTasks> originalList = []; // 存储分组结果:key为年份值,value为对应年份的任务列表 final Map<int, List<DayTasks>> yearGroups = {}; for (final dayTask in originalList) { // 提取当前任务对应的年份 final taskYear = dayTask._date.year; // 初始化对应年份的空列表(如果尚未存在) yearGroups.putIfAbsent(taskYear, () => <DayTasks>[]); // 将当前任务加入对应年份的分组 yearGroups[taskYear]!.add(dayTask); } // 转换为要求的子列表集合(无年份key的纯列表结构) final List<List<DayTasks>> splitResult = yearGroups.values.toList();
简化写法(使用官方collection工具包)
如果项目已经引入了package:collection,可以用内置的groupBy函数简化分组代码:
// 导入工具包 import 'package:collection/collection.dart'; final Map<int, List<DayTasks>> yearGroups = groupBy( originalList, // 分组的key为任务对应的年份 (dayTask) => dayTask._date.year, ); final List<List<DayTasks>> splitResult = yearGroups.values.toList();
常用调整
- 时区偏差修正:默认
DateTime.year取的是本地时区的年份,如果需要按UTC时间的年份做拆分,把年份取值替换为dayTask._date.toUtc().year即可 - 排序调整:默认分组顺序是按照列表中第一次出现对应年份的顺序排列,如果需要按年份从小到大排列子列表,可以在输出前对分组key做排序处理:
// 按年份升序输出拆分结果 final sortedSplitResult = (yearGroups.keys.toList()..sort()) .map((year) => yearGroups[year]!) .toList();
内容的提问来源于stack exchange,提问作者Satyam Pandey
相关产品推荐
相关产品推荐

