Класс Map или словарь представляет коллекцию элементов, где каждый элемент имеет ключ и значение. Ключ и значение элемента могут представлять различные типы. Причем ключи представляют уникальные значения - не может быть два и более элементов с одинаковыми ключами. Такой объект напоминает словарь, где каждому слову сопоставляется его перевод или некоторое описание. Поэтому такие объекты часто называются словарями.
Для создания объекта Map могут использоваться фигурные скобки {}. Например, создание пустого словаря:
Map<int, String> map = {};
Класс Map типизируется двумя типами. Первый тип представляет тип ключей, а второй - тип значений. То есть в примере выше ключи представляют значения типа
int
, а значения - тип String.
Альтернативное определение пустого словаря:
var map = <int, String>{};
Также можно создать пустой словарь следующим образом:
var map = {};
В этом случае создается словарь типа Map<dynamic, dynamic>
.
Четвертый способ создания пустого словаря представляет использование конструктора Map:
var map = Map();
Можно сразу инициализировать объект Map значениями. Для этого в фигурных скобках через запятую определяются элементв в формате
ключ : значение
:
var map = { 1: "Tom", 2: "Bob", 3: "Sam" };
В данном случае объект map имеют тип Map<int, String>
- в качестве типа ключей используется тип int, а в качестве типа значений - тип String.
А в самом словаре есть три ключа - 1, 2, 3, с которыми сопоставляются
три значения - строки "Tom", "Bob", "Sam".
Функция print позволяет удобным образом вывести содержимое словаря на консоль:
void main (){ var map = { 1: "Tom", 2: "Bob", 3: "Sam" }; print(map); // {1: Tom, 2: Bob, 3: Sam} }
Стоит отметить, что все ключи должны быть уникальными. Если вдруг мы определим в словаре (или добавим в словарь) элемент с уже имеющимся ключом, то он просто затрет ранее существовавшее значение:
void main (){ var map = { 1: "Tom", 2: "Bob", 3: "Sam", 1: "Alice" }; print(map); // {1: Alice, 2: Bob, 3: Sam} }
Используя ключи, мы можем получить или изменить значения элементов:
void main (){ var map = { 1: "Tom", 2: "Bob", 3: "Sam" }; var second = map[2]; // получим значение элемента с ключом 2 print(second); // Bob map[1] = "Tomas"; // изменим значение элемента с ключом 1 print(map); // {1: Tomas, 2: Bob, 3: Sam} }
Для обращения к элементу после названия словаря в квадратных скобках указываем ключ элемента. Например, получение элемента с ключом 2:
var second = map[2];
Изменение значения элемента с ключом 1:
map[1] = "Tomas";
Основные свойства:
entries: возвращает объект Iterable<MapEntry<K, V>>
, который представляет все
элементы Map. Каждый отдельный элемент словаря представляет объект MapEntry
keys: возвращает объект Iterable<K>
, который представляет все ключи Map
values: возвращает объект Iterable<V>
, который представляет все значения Map
length: возвращает количество элементов в Map
isEmpty: возвращает true, если Map пуст
isNotEmpty: возвращает true, если Map имеет элементы
Использование свойств:
void main (){ var map = { 1: "Tom", 2: "Bob", 3: "Sam" }; print("Length: ${map.length}"); // Length: 3 print("Empty: ${map.isEmpty}"); // Empty: false print(map.entries); // (MapEntry(1: Tom), MapEntry(2: Bob), MapEntry(3: Sam)) print(map.keys); // (1, 2, 3) print(map.values); // (Tom, Bob, Sam) }
addAll(Map<K, V> other): добавляет в Map другой объект Map
addEntries(Iterable<MapEntry<K, V>> newEntries): добавляет в Map коллекцию Iterable<MapEntry<K, V>>
clear(): удаляет все элементы из Map
containsKey(Object key): возвращает true, если Map содержит ключ key
containsValue(Object value): возвращает true, если Map содержит значение value
forEach(): перебирает все элементы и для каждого из них вызывает определенную функцию
V putIfAbsent(K key, V ifAbsent()): если ключ key есть в Map, то возвращает значение по этому ключу. Если ключ отсутствует, то добавляет в Map значение, которое возвращается функцией isAbsent.
remove(Object key): удаляет из Map элемент с ключом key
Для перебора объекта Map можно применять цикл for-in
. Мы можем использовать свойства entries, keys, values и перебрать соответственно
элементы, ключи и значения.
Стоит отметить, что каждый элемент в Map фактически представляет объект MapEntry<K, V>
, где K - тип ключей, а V - тип значений.
У этого типа есть два свойства: key (ключ элемента) и value (хранит значение элемента).
Используя эти свойства, мы можем получить содержимое элементов в Map. Например, переберем все элементы и отдельно все ключи и значения Map:
void main (){ var map = { 1: "Tom", 2: "Bob", 3: "Sam" }; for(final element in map.entries){ print(element.key); // получаем ключ элемента print(element.value); // получаем значение элемента } }
Подобным образом перебирем по отдельности ключи и значения:
void main (){ var map = { 1: "Tom", 2: "Bob", 3: "Sam" }; // перебираем ключи for(final key in map.keys){ print(key); } // перебираем значения for(final value in map.values){ print(value); } }
В качестве альтернативы можно применять метод forEach(). Он принимает функцию, в которую передается ключ и значение каждого элемента словаря:
void main (){ var map = { 1: "Tom", 2: "Bob", 3: "Sam" }; map.forEach((key, value) => print("$key - $value")); }
В данном случае в метод forEach передаем анонимную функцию, которая принимает два параметра - ключ и значение элемента и выводит их на консоль. Консольный вывод:
1 - Tom 2 - Bob 3 - Sam
Для добавления нового элемента достаточно установить элемент по ранее не существовавшему ключу:
void main (){ var map = { 1: "Tom", 2: "Bob", 3: "Sam" }; map[4] = "Alice"; // добавляем элемент с ключом 4 print(map); // {1: Tom, 2: Bob, 3: Sam, 4: Alice} }
В данном случае элемента с ключом 4 изначально нет в map. Поэтому установка значения по этому ключу приведет к добавлению нового элемента.
Метод addAll() применяется для добавления элементов из другого словаря, который передается в качестве параметра:
void main (){ var women = {4: "Kate", 5: "Alice"}; var map = { 1: "Tom", 2: "Bob", 3: "Sam" }; map.addAll(women); // добавляем словарь women print(map); // {1: Tom, 2: Bob, 3: Sam, 4: Kate, 5: Alice} }
Для удаления применяется метод remove(), в который передается ключ удаляемого элемента:
void main (){ var map ={ 1: "Tom", 2: "Bob", 3: "Sam" }; map.remove(2); // удаляем элемент с ключом 2 print(map); // {1: Tom, 3: Sam} }
С помощью методов containsKey() и containsValue() можно соответственно проверить наличие определенного ключа и значения в Map:
void main (){ var map ={ 1: "Tom", 2: "Bob", 3: "Sam" }; print(map.containsKey(2)); // true print(map.containsKey(4)); // false print(map.containsValue("Sam")); // true print(map.containsValue("Tim")); // false }