Dart:我是否应该遍历Map.entries或Map.values?

时间:2019-02-15 18:58:40

标签: dart

每次我需要遍历Dart中的Map的值时,我都会考虑到此循环将产生的成本,包括复杂性和产生的垃圾量。有两种方法可以迭代Map的值:Map.valuesMap.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实现之间是否有区别。

2 个答案:

答案 0 :(得分:18)

我们应该根据需求迭代地图。

  1. 如果我们只需要迭代键

    map.keys.forEach((k) => print("Key : $k"));

  2. 如果我们只需要迭代值

    map.values.forEach((v) => print("Value: $v"));

  3. 如果我们需要迭代两个键值。

    map.forEach((k, v) => print("Key : $k, Value : $v"));

答案 1 :(得分:0)

如果您遍历条目,则会为每个键值组合创建一个MapEntry实例。

如果只需要值,则迭代map.values效率更高。