繁体   English   中英

飞镖折叠与零安全

[英]Dart fold with null safety

我有以下代码使用列表折叠为同名的人汇总现金。

void main() { 
 List<Map<String,dynamic>> people = [{'name': 'Jim', 'cash':44.86},{'name': 'Jim', 'cash':40.55},{'name': 'Bob', 'cash':10.99},{'name': 'Bob', 'cash':10.99}];
  Map resultAmount = people.fold<Map<String, num>>({}, (totalMap, element) {
    final String key = element['name'];
      if (totalMap[key] == null) totalMap[key] = 0;
      totalMap[key] += element['cash'].toDouble();
      return totalMap;
    });
  print(resultAmount);
}

印刷:

{Jim: 85.41, Bob: 21.98}

我怎样才能让它与空安全一起工作?

你可以简化线

if (totalMap[key] == null) totalMap[key] = 0;

只需使用??=运算符。

然后你需要重新处理totalMap[key]增量以更好地处理空安全,因为 Dart 的静态分析不是那么聪明。

void main() { 
 List<Map<String,dynamic>> people = [{'name': 'Jim', 'cash':44.86},{'name': 'Jim', 'cash':40.55},{'name': 'Bob', 'cash':10.99},{'name': 'Bob', 'cash':10.99}];
  Map<String, num> resultAmount = people.fold<Map<String, num>>({}, (totalMap, element) {
    final String key = element['name'];
    totalMap[key] ??= 0;
    totalMap[key] = element['cash'].toDouble() + totalMap[key];
    return totalMap;
  });
  print(resultAmount);
}

或者,也许更优雅的解决方案是使用临时变量:

void main() { 
 List<Map<String,dynamic>> people = [{'name': 'Jim', 'cash':44.86},{'name': 'Jim', 'cash':40.55},{'name': 'Bob', 'cash':10.99},{'name': 'Bob', 'cash':10.99}];
  Map<String, num> resultAmount = people.fold<Map<String, num>>({}, (totalMap, element) {
    final String key = element['name'];
    
    double tmp = totalMap[key]?.toDouble() ?? 0.0;
    tmp += element['cash'].toDouble();
    
    totalMap[key] = tmp;
    return totalMap;
  });
  print(resultAmount);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM