You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 17:40:41