Flutter中优化交易列表转日报表Map列表的实现问询
优化每日收支报表生成方法的优雅实现
已实现将TransactionList转换为包含日期、总收入、总支出、余额的Map数组的方法,当前代码可正常运行,以下是优化后的进阶写法。
交易数据
List<Transaction> transactions=[ Transaction(date: DateTime(2023,01,18), isExpense: true, amount: 100.00,), Transaction(date: DateTime(2023,01,18), isExpense: true, amount: 200.00,), Transaction(date: DateTime(2023,01,18), isExpense: false, amount: 300.00,), Transaction(date: DateTime(2023,01,19), isExpense: false, amount: 200.00,), Transaction(date: DateTime(2023,01,19), isExpense: false, amount: 100.00,), ];
原有实现代码
List<Map<String, dynamic>> dailyreport() { //grouping data based on date field of transactions var maplist = groupBy(transactions, (Transaction element) => element.date); List<Map<String, dynamic>> reportlist = []; //loop for each key for (var x in maplist.keys) { double sum_expenses = 0; double sum_income = 0; //getting transaction based on key value List<Transaction> trans = maplist[x] as List<Transaction>; for (int i = 0; i < trans.length; i++) { if (trans[i].isExpense) sum_expenses = sum_expenses + trans[i].amount; else sum_income = sum_income + trans[i].amount; } //adding map to reportlist reportlist.add({ 'date': x, 'expenses': sum_expenses, 'income': sum_income, 'balance': sum_income - sum_expenses, }); } return reportlist; }
优化后的实现代码
List<Map<String, dynamic>> dailyReport() { // 按日期分组交易记录 final groupedTransactions = groupBy(transactions, (Transaction t) => t.date); // 将分组数据转换为报表条目 return groupedTransactions.entries.map((entry) { final date = entry.key; final dailyTransactions = entry.value; // 通过fold一次性计算当日收支总和 final dailySums = dailyTransactions.fold( {'income': 0.0, 'expenses': 0.0}, (accumulator, transaction) { if (transaction.isExpense) { accumulator['expenses'] = accumulator['expenses']! + transaction.amount; } else { accumulator['income'] = accumulator['income']! + transaction.amount; } return accumulator; }, ); final income = dailySums['income']!; final expenses = dailySums['expenses']!; return { 'date': date, 'income': income, 'expenses': expenses, 'balance': income - expenses, }; }).toList(); }
优化说明
- 用
entries.map替代外层for循环,直接将分组后的键值对转换为报表条目,符合函数式编程风格,代码更简洁 - 使用
fold方法替代内层循环,一次性计算出当日的总收入和总支出,减少临时变量的声明和嵌套层级 - 变量命名更规范,语义更清晰(如
dailyReport采用小驼峰命名,groupedTransactions明确表达变量用途) - 代码结构更紧凑,逻辑连贯,可读性更强
内容的提问来源于stack exchange,提问作者Irfan Ganatra
相关产品推荐
相关产品推荐

