将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可以避免这种情况吗?
答案 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;