Дарт: Должен ли я предпочесть перебрать Map.entries или Map.values?

Каждый раз, когда мне нужно перебрать значения Map в Dart я рассматриваю стоимость, которую понесет этот цикл, с точки зрения сложности и количества производимого мусора. Есть два способа перебора значений 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 реализации в этом аспекте.

1 ответ

Мы должны перебирать карту в соответствии с требованиями.

  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"));

Если вы перебираете записи MapEntry Экземпляр создается для каждой комбинации ключ-значение.

Если вам нужны только значения, итерации map.values является более эффективным.

Другие вопросы по тегам