Flutter Dart:优化分类详情映射列表实现代码
简化交易分类统计的实现方案
现有一组交易数据,需要实现一个getter来展示分类维度的详情,包括特定分类的条目数量、总支出。当前实现较为繁琐,希望获取更简洁的实现方案。
原始交易数据
List<Map<String, dynamic>> transactions = [ { 'category': 'Food', 'amount': 100, }, { 'category': 'Travel', 'amount': 30, }, { 'category': 'Food', 'amount': 90, }, { 'category': 'Travel', 'amount': 50, }, { 'category': 'Shopping', 'amount': 1300, }, { 'category': 'Food', 'amount': 130, }, ];
期望输出
[ {'category':'Food','total':320,'entries':3}, {'category':'Travel','total':80,'entries':2}, {'category':'Shopping','total':1300,'entries':1} ]
注:原期望输出中的数值与实际数据不符,已按真实计算结果修正
当前实现代码
List<String> get availablecategories { List<String> categories = []; transactions.forEach((element) { if (!categories.contains(element['category'])) categories.add(element['category']); }); return categories; } List<Map<String, dynamic>> get categorydetails { List<Map<String, dynamic>> templist = []; availablecategories.forEach((element) { var temp = transactions.where((trans) { return element == trans['category']; }).toList(); int totalexp = temp.fold(0, (previousValue, element) => previousValue + element['amount'] as int); templist.add({ 'category': element, 'amount': totalexp, 'entries': temp.length, }); }); return templist; } void main() { print(categorydetails); }
优化后的简洁实现
使用Map分组统计,只需一次遍历即可完成所有计算,避免多次循环带来的性能损耗,代码更紧凑:
List<Map<String, dynamic>> get categoryDetails { final categoryStats = <String, Map<String, dynamic>>{}; for (final trans in transactions) { final category = trans['category'] as String; final amount = trans['amount'] as int; categoryStats.putIfAbsent(category, () => { 'category': category, 'total': 0, 'entries': 0, }); categoryStats[category]!['total'] = (categoryStats[category]!['total'] as int) + amount; categoryStats[category]!['entries'] = (categoryStats[category]!['entries'] as int) + 1; } return categoryStats.values.toList(); } void main() { print(categoryDetails); }
优化点说明
- 无需单独维护
availablecategoriesgetter,分组过程自动收集所有分类 - 仅遍历交易列表一次,相比原方案多次遍历(收集分类+每个分类过滤列表)效率更高
- 使用
putIfAbsent简化分类初始化逻辑,代码更简洁易读
内容的提问来源于stack exchange,提问作者Irfan Ganatra
相关产品推荐
相关产品推荐

