用于将地图值自动初始化为0的习惯用法

时间:2014-01-24 19:24:48

标签: dart

将Map值自动初始化为0时,是否有更好的习惯用法?在以下代码中,将添加值的方法与 List 类型与 int 类型的目标之间存在不对称。

main() {
  addToList(Map m, v) =>
    m..putIfAbsent('foo', () => []).add(v);

  ///////////////////////////////////////////////////////////
  // Not allowed (expression is not assignable)
  // addToScalar(Map m, v) =>
  //   m..putIfAbsent('foo', () => 0) += 3;

  addToScalar1(Map m, v) {
    m.putIfAbsent('foo', () => 0);
    m['foo'] += v;
    return m;
  }

  addToScalar2(Map m, v) {
    if(m.containsKey('foo')) {
      m['foo'] += v;
    } else {
      m['foo'] = v;
    }
    return m;
  }

  print(addToList({}, 3));
  print(addToScalar1({}, 3));
  print(addToScalar2({}, 3));
}

概念上 addToList addToScalar 做类似的事情。但是作为值类型存储的int的模拟可能是:

m.putIfAbsent('foo', () => 0) += someValue

由于 putIfAbsent 返回的内容不可分配,因此无效。因此,对于标量情况下使用的两种工作方法,在地图中查找键'foo'的任务正在进行两次。使用Map API可以避免这种情况吗?

1 个答案:

答案 0 :(得分:3)

不,您目前无法避免两次查找以修改地图值。

我们已经考虑过,但从未决定实现这一目标的方法(例如,“更新”方法)。

您的问题的两个最短/最有效的解决方案是:

int _returnZero() => 0; // Toplevel or static function.

...  
  map[key] = map.putIfAbsent(key, _returnZero) + v;
...

int value = map[key];
map[key] = (value == null) ? v : value + v;