每次我需要遍历Dart中的Map
的值时,我都会考虑到此循环将产生的成本,包括复杂性和产生的垃圾量。有两种方法可以迭代Map
的值:Map.values
和Map.entries
。例如:
Map<String, Person> people;
int olderThan(int age) {
int result = 0;
for(Person p in people.values)
if(p.age > age) result++;
return result;
}
int olderThan2(int age) {
int result = 0;
for(MapEntry<String, Person> me in people.entries)
if(me.value.age > age) result++;
return result;
}
// Which one is faster: olderThan or olderThan2?
如果Map
在内部将其值存储为MapEntry
对象,则entries
的效率可能甚至比values
高。 Map
的实现细节被深埋在Dart库的内部,所以我想知道是否有人知道这些知识并且可以阐明这一主题。
我了解到Map.entries
使您可以访问密钥,但是我所谈论的是我不需要使用条目密钥的情况。我也了解Map
的不同实现。我对默认实现LinkedHashMap
最为感兴趣,但是很高兴知道在这一方面不同的Map
实现之间是否有区别。
答案 0 :(得分:18)
我们应该根据需求迭代地图。
如果我们只需要迭代键
map.keys.forEach((k) => print("Key : $k"));
如果我们只需要迭代值
map.values.forEach((v) => print("Value: $v"));
如果我们需要迭代两个键值。
map.forEach((k, v) => print("Key : $k, Value : $v"));
答案 1 :(得分:0)
如果您遍历条目,则会为每个键值组合创建一个MapEntry
实例。
如果只需要值,则迭代map.values
效率更高。