Дарт: Должен ли я предпочесть перебрать 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 ответ
Мы должны перебирать карту в соответствии с требованиями.
Если нам нужно было перебирать только ключи
map.keys.forEach((k) => print("Key : $k"));
Если нам нужно было перебирать только значения
map.values.forEach((v) => print("Value: $v"));
Если нам потребовалось перебрать оба ключевых значения.
map.forEach((k, v) => print("Key : $k, Value : $v"));
Если вы перебираете записи MapEntry
Экземпляр создается для каждой комбинации ключ-значение.
Если вам нужны только значения, итерации map.values
является более эффективным.