Map
Карты — это основная структура данных "ключ-значение" в Elixir.
Карты можно создавать с помощью синтаксиса %{}, а пары "ключ-значение" можно выразить как key => value.
iex> %{}
%{}
iex> %{"one" => :two, 3 => "four"}
%{3 => "four", "one" => :two}
Пары "ключ-значение" в карте не следуют никакому порядку (поэтому отпечатанная карта в примере выше имеет другой порядок, чем карта, которая была создана).
Карты не накладывают никаких ограничений на тип ключа: ключом в карте может быть всё. Как структура "ключ-значение", карты не допускают дублирования ключей. Ключи сравниваются с помощью оператора точного равенства (===/2). Если в литерале карты определены коллидирующие ключи, приоритет имеет последний.
Когда ключ в паре "ключ-значение" является атомом, можно использовать сокращённый синтаксис key: value (как и во многих других специальных формах):
iex> %{a: 1, b: 2}
%{a: 1, b: 2}
Если вы хотите смешать сокращённый синтаксис с =>, сокращённый синтаксис должен стоять в конце:
iex> %{"hello" => "world", a: 1, b: 2}
%{:a => 1, :b => 2, "hello" => "world"}
К ключам в картах можно получить доступ с помощью некоторых функций в этом модуле (например, Map.get/3 или Map.fetch/2) или с помощью синтаксиса map[], предоставляемого модулем Access:
iex> map = %{a: 1, b: 2}
iex> Map.fetch(map, :a)
{:ok, 1}
iex> map[:b]
2
iex> map["non_existing_key"]
nil
Для доступа к ключам-атомам также можно использовать обозначение map.key. Обратите внимание, что map.key вызовет исключение KeyError, если карта map не содержит ключ :key, в отличие от map[:key], которая вернёт nil.
map = %{foo: "bar", baz: "bong"}
map.foo
#=> "bar"
map.non_existing_key
** (KeyError) key :non_existing_key not found in: %{baz: "bong", foo: "bar"}
Избегайте скобок
Не добавляйте скобки при обращении к полям, как в
data.key(). Если скобки используются, Elixir ожидает, чтоdataбудет атомом, представляющим модуль, и попытается вызвать функциюkey/0в нём.
Два синтаксиса для доступа к ключам раскрывают двойственную природу карт. Синтаксис map[key] используется для динамически созданных карт, которые могут иметь любой ключ любого типа. map.key используется с картами, содержащими предопределённый набор атомных ключей, которые, как ожидается, всегда будут присутствовать. Структуры, определённые с помощью defstruct/1, являются одним примером таких "статических карт", где ключи также могут проверяться во время компиляции.
Карты можно сопоставлять по шаблону. Когда карта находится в левой части сопоставления по шаблону, она совпадёт, если карта в правой части содержит ключи в левой части и их значения совпадают с значениями в левой части. Это означает, что пустая карта совпадает с любой картой.
iex> %{} = %{foo: "bar"}
%{foo: "bar"}
iex> %{a: a} = %{:a => 1, "b" => 2, [:c, :e, :e] => 3}
iex> a
1
Но это вызовет исключение MatchError:
%{:c => 3} = %{:a => 1, 2 => :b}
Переменные могут использоваться в качестве ключей карт как при написании литералов карт, так и при сопоставлении:
iex> n = 1
1
iex> %{n => :one}
%{1 => :one}
iex> %{^n => :one} = %{1 => :one, 2 => :two, 3 => :three}
%{1 => :one, 2 => :two, 3 => :three}
Карты также поддерживают определённый синтаксис обновления для обновления значения, хранящегося под существующими ключами. Вы можете обновить с помощью синтаксиса ключей-атомов:
iex> map = %{one: 1, two: 2}
iex> %{map | one: "one"}
%{one: "one", two: 2}
Или любым другим ключом:
iex> other_map = %{"three" => 3, "four" => 4}
iex> %{other_map | "three" => "three"}
%{"four" => 4, "three" => "three"}
При обновлении ключа, который не существует в карте, будет вызвано исключение KeyError:
%{map | three: 3}
Функции в этом модуле, которые должны найти определённый ключ, работают за логарифмическое время. Это означает, что время, необходимое для поиска ключей, растёт по мере увеличения карты, но оно не прямо пропорционально размеру карты. По сравнению с поиском элемента в списке, это работает лучше, потому что списки имеют линейную сложность времени. Некоторые функции, такие как keys/1 и values/1, работают за линейное время, потому что им необходимо получить доступ ко всем элементам карты.
Карты также реализуют протокол Enumerable, поэтому многие функции для работы с картами находятся в модуле Enum. Кроме того, следующие функции для карт находятся в Kernel:
Типы
Функции
- delete(map, key)
Удаляет запись в
mapдля определенногоkey.- drop(map, keys)
Удаляет указанные
keysизmap.- equal?(map1, map2)
Проверяет, равны ли два словаря.
- fetch(map, key)
Извлекает значение для определенного
keyв заданномmap.- fetch!(map, key)
Извлекает значение для определенного
keyв заданномmap, вызывая ошибку, еслиmapне содержитkey.- filter(map, fun)
Возвращает словарь, содержащий только те пары из
map, для которыхfunвозвращает истинное значение.- from_keys(keys, value)
Создаёт словарь из заданных
keysи фиксированногоvalue.- from_struct(struct)
Преобразует
structв словарь.- get(map, key, default \\ nil)
Получает значение для определенного
keyвmap.- get_and_update(map, key, fun)
Получает значение из
keyи обновляет его за один проход.- get_and_update!(map, key, fun)
Получает значение из
keyи обновляет его за один проход. Возбуждает исключение, если нетkey.- get_lazy(map, key, fun)
Получает значение для определенного
keyвmap.- has_key?(map, key)
Возвращает, существует ли заданный
keyв заданномmap.- intersect(map1, map2)
Пересекает два словаря, возвращая словарь с общими ключами.
- intersect(map1, map2, fun)
Пересекает два словаря, возвращая словарь с общими ключами и разрешая конфликты с помощью функции.
- keys(map)
Возвращает все ключи из
map.- merge(map1, map2)
Объединяет два словаря в один.
- merge(map1, map2, fun)
Объединяет два словаря в один, разрешая конфликты с помощью заданной
fun.- new()
Возвращает новый пустой словарь.
- new(enumerable)
Создаёт словарь из
enumerable.- new(enumerable, transform)
Создаёт словарь из
enumerableс помощью заданной функции преобразования.- pop(map, key, default \\ nil)
Удаляет значение, связанное с
keyвmapи возвращает значение и обновлённый словарь.- pop!(map, key)
Удаляет значение, связанное с
keyвmapи возвращает значение и обновлённый словарь, или возбуждает исключение, еслиkeyотсутствует.- pop_lazy(map, key, fun)
Лениво возвращает и удаляет значение, связанное с
keyвmap.- put(map, key, value)
Добавляет заданное
valueподkeyвmap.- put_new(map, key, value)
Добавляет заданное
valueподkeyтолько если записьkeyещё не существует вmap.- put_new_lazy(map, key, fun)
Вычисляет
funи добавляет результат подkeyвmapтолько еслиkeyещё не присутствует.- reject(map, fun)
Возвращает словарь, исключая пары из
mapдля которыхfunвозвращает истинное значение.- replace(map, key, value)
Заменяет значение под
keyтолько еслиkeyуже существует вmap.- replace!(map, key, value)
Заменяет значение под
keyтолько еслиkeyуже существует вmap.- replace_lazy(map, key, fun)
Заменяет значение под
keyс помощью заданной функции только еслиkeyуже существует вmap.- split(map, keys)
Берёт все записи, соответствующие указанным
keysвmapи извлекает их в отдельный словарь.- split_with(map, fun)
Разделяет
mapна два словаря в соответствии с заданной функциейfun.- take(map, keys)
Возвращает новый словарь со всеми парами ключ-значение в
map, где ключ находится вkeys.- to_list(map)
Преобразует
mapв список.- update(map, key, default, fun)
Обновляет
keyвmapс помощью заданной функции.- update!(map, key, fun)
Обновляет
keyс помощью заданной функции.- values(map)
Возвращает все значения из
map.
delete(map, key)Source
@spec delete(map(), key()) :: map()
Удаляет запись в map для определенного key.
Если key не существует, возвращает map без изменений.
Встроено компилятором.
Примеры
iex> Map.delete(%{a: 1, b: 2}, :a)
%{b: 2}
iex> Map.delete(%{b: 2}, :a)
%{b: 2} drop(map, keys)Source
@spec drop(map(), [key()]) :: map()
Удаляет указанные keys из map.
Если keys содержит ключи, которых нет в map, они просто игнорируются.
Примеры
iex> Map.drop(%{a: 1, b: 2, c: 3}, [:b, :d])
%{a: 1, c: 3} equal?(map1, map2)Source
@spec equal?(map(), map()) :: boolean()
Проверяет, равны ли два словаря.
Два словаря считаются равными, если они содержат одинаковые ключи и эти ключи содержат одинаковые значения.
Примечание: эта функция существует для полноты, чтобы модули Map и Keyword предоставляли аналогичные API. На практике разработчики часто сравнивают словари, используя ==/2 или ===/2 напрямую.
Примеры
iex> Map.equal?(%{a: 1, b: 2}, %{b: 2, a: 1})
true
iex> Map.equal?(%{a: 1, b: 2}, %{b: 1, a: 2})
false
Сравнение ключей и значений выполняется с использованием ===/3, что означает, что целые числа не эквивалентны числам с плавающей точкой:
iex> Map.equal?(%{a: 1.0}, %{a: 1})
false fetch(map, key)Source
@spec fetch(map(), key()) :: {:ok, value()} | :error Извлекает значение для определенного key в данном map.
Если map содержит указанный key, то его значение возвращается в виде {:ok, value}. Если map не содержит key, возвращается :error.
Встроено компилятором.
Примеры
iex> Map.fetch(%{a: 1}, :a)
{:ok, 1}
iex> Map.fetch(%{a: 1}, :b)
:error fetch!(map, key)Source
@spec fetch!(map(), key()) :: value()
Извлекает значение для определенного key в данном map, генерируя ошибку, если map не содержит key.
Если map содержит key, соответствующее значение возвращается. Если map не содержит key, генерируется исключение KeyError.
Встроено компилятором.
Примеры
iex> Map.fetch!(%{a: 1}, :a)
1 filter(map, fun)Source
@spec filter(map(), ({key(), value()} -> as_boolean(term()))) :: map() Возвращает словарь, содержащий только те пары из map, для которых fun возвращает истинное значение.
fun получает ключ и значение каждого элемента в словаре в виде пары ключ-значение.
См. также reject/2, который отбрасывает все элементы, где функция возвращает истинное значение.
Рекомендации по производительности
Если вы обнаруживаете, что делаете несколько вызовов
Map.filter/2иMap.reject/2в цепочке, скорее всего, более эффективно использоватьEnum.map/2иEnum.filter/2, а затем преобразовать в словарь с помощьюMap.new/1.
Примеры
iex> Map.filter(%{one: 1, two: 2, three: 3}, fn {_key, val} -> rem(val, 2) == 1 end)
%{one: 1, three: 3} from_keys(keys, value)Source
@spec from_keys([key()], value()) :: map()
Создает словарь из заданных keys и фиксированного value.
Примеры
iex> Map.from_keys([1, 2, 3], :number)
%{1 => :number, 2 => :number, 3 => :number} from_struct(struct)Source
@spec from_struct(atom() | struct()) :: map()
Преобразует struct в словарь.
Принимает модуль структуры или саму структуру и просто удаляет поле __struct__ из заданной структуры или из новой структуры, сгенерированной из заданного модуля.
Пример
defmodule User do
defstruct [:name]
end
Map.from_struct(User)
#=> %{name: nil}
Map.from_struct(%User{name: "john"})
#=> %{name: "john"} get(map, key, default \\ nil)Source
@spec get(map(), key(), value()) :: value()
Получает значение для определенного key в map.
Если key присутствует в map, возвращается его значение value. В противном случае возвращается default.
Если default не указан, используется nil.
Примеры
iex> Map.get(%{}, :a)
nil
iex> Map.get(%{a: 1}, :a)
1
iex> Map.get(%{a: 1}, :b)
nil
iex> Map.get(%{a: 1}, :b, 3)
3
iex> Map.get(%{a: nil}, :a, 1)
nil get_and_update(map, key, fun)Source
@spec get_and_update(
map(),
key(),
(value() | nil -> {current_value, new_value :: value()} | :pop)
) ::
{current_value, new_map :: map()}
when current_value: value() Получает значение из key и обновляет его, все в одном проходе.
fun вызывается с текущим значением под key в map (или nil, если key не присутствует в map) и должно вернуть кортеж из двух элементов: текущее значение (полученное значение, над которым можно выполнить операции перед возвратом) и новое значение, которое будет храниться под key в результирующем новом словаре. fun также может вернуть :pop, что означает, что текущее значение должно быть удалено из map и возвращено (что заставит эту функцию вести себя как Map.pop(map, key)).
Возвращаемое значение — кортеж из двух элементов с текущим значением, возвращённым fun, и новым словарем с обновлённым значением под key.
Примеры
iex> Map.get_and_update(%{a: 1}, :a, fn current_value ->
...> {current_value, "new value!"}
...> end)
{1, %{a: "new value!"}}
iex> Map.get_and_update(%{a: 1}, :b, fn current_value ->
...> {current_value, "new value!"}
...> end)
{nil, %{a: 1, b: "new value!"}}
iex> Map.get_and_update(%{a: 1}, :a, fn _ -> :pop end)
{1, %{}}
iex> Map.get_and_update(%{a: 1}, :b, fn _ -> :pop end)
{nil, %{a: 1}} get_and_update!(map, key, fun)Source
@spec get_and_update!(
map(),
key(),
(value() -> {current_value, new_value :: value()} | :pop)
) ::
{current_value, map()}
when current_value: value() Получает значение из key и обновляет его, все в одном проходе. Вызывает исключение, если нет key.
Ведёт себя точно так же, как get_and_update/3, но генерирует исключение KeyError, если key отсутствует в map.
Примеры
iex> Map.get_and_update!(%{a: 1}, :a, fn current_value ->
...> {current_value, "new value!"}
...> end)
{1, %{a: "new value!"}}
iex> Map.get_and_update!(%{a: 1}, :b, fn current_value ->
...> {current_value, "new value!"}
...> end)
** (KeyError) key :b not found in: %{a: 1}
iex> Map.get_and_update!(%{a: 1}, :a, fn _ ->
...> :pop
...> end)
{1, %{}} get_lazy(map, key, fun)Source
@spec get_lazy(map(), key(), (-> value())) :: value()
Получает значение для определенного key в map.
Если key присутствует в map, возвращается его значение value. В противном случае оценивается fun и возвращается результат.
Это полезно, если значение по умолчанию очень дорого вычисляется или в целом трудно настраивать и снимать.
Примеры
iex> map = %{a: 1}
iex> fun = fn ->
...> # some expensive operation here
...> 13
...> end
iex> Map.get_lazy(map, :a, fun)
1
iex> Map.get_lazy(map, :b, fun)
13 has_key?(map, key)Source
@spec has_key?(map(), key()) :: boolean()
Возвращает, существует ли данный key в данном map.
Встроено компилятором.
Примеры
iex> Map.has_key?(%{a: 1}, :a)
true
iex> Map.has_key?(%{a: 1}, :b)
false intersect(map1, map2)Source
@spec intersect(map(), map()) :: map()
Пересекает две карты, возвращая карту с общими ключами.
Значения в возвращаемой карте — это значения пересекающихся ключей в map2.
Встраивается компилятором.
Примеры
iex> Map.intersect(%{a: 1, b: 2}, %{b: "b", c: "c"})
%{b: "b"} intersect(map1, map2, fun)Source
@spec intersect(map(), map(), (key(), value(), value() -> value())) :: map()
Пересекает две карты, возвращая карту с общими ключами и разрешая конфликты с помощью функции.
Заданная функция будет вызываться при наличии дубликатов ключей; её аргументы — key (дублирующийся ключ), value1 (значение key в map1), и value2 (значение key в map2). Значение, возвращаемое fun, используется в качестве значения под key в результирующей карте.
Примеры
iex> Map.intersect(%{a: 1, b: 2}, %{b: 2, c: 3}, fn _k, v1, v2 ->
...> v1 + v2
...> end)
%{b: 4} keys(map)Source
@spec keys(map()) :: [key()]
Возвращает все ключи из map.
Встраивается компилятором.
Примеры
iex> Map.keys(%{a: 1, b: 2})
[:a, :b] merge(map1, map2)Source
@spec merge(map(), map()) :: map()
Объединяет две карты в одну.
Все ключи в map2 будут добавлены к map1, перезаписывая любые существующие (т.е. ключи в map2 имеют приоритет над ключами в map1).
Если у вас есть структура и вы хотите добавить набор ключей в структуру, не используйте эту функцию, так как она добавит все ключи из правой части в структуру, даже если ключ не является частью структуры. Вместо этого используйте struct/2.
Встраивается компилятором.
Примеры
iex> Map.merge(%{a: 1, b: 2}, %{a: 3, d: 4})
%{a: 3, b: 2, d: 4} merge(map1, map2, fun)Source
@spec merge(map(), map(), (key(), value(), value() -> value())) :: map()
Объединяет две карты в одну, разрешая конфликты с помощью заданной fun.
Все ключи в map2 будут добавлены к map1. Заданная функция будет вызываться при наличии дубликатов ключей; её аргументы — key (дублирующийся ключ), value1 (значение key в map1), и value2 (значение key в map2). Значение, возвращаемое fun, используется в качестве значения под key в результирующей карте.
Примеры
iex> Map.merge(%{a: 1, b: 2}, %{a: 3, d: 4}, fn _k, v1, v2 ->
...> v1 + v2
...> end)
%{a: 4, b: 2, d: 4} new()Source
@spec new() :: map()
Возвращает новую пустую карту.
Примеры
iex> Map.new()
%{} new(enumerable)Source
@spec new(Enumerable.t()) :: map()
Создает карту из enumerable.
Дублирующиеся ключи удаляются; последний имеет приоритет.
Примеры
iex> Map.new([{:b, 1}, {:a, 2}])
%{a: 2, b: 1}
iex> Map.new(a: 1, a: 2, a: 3)
%{a: 3} new(enumerable, transform)Source
@spec new(Enumerable.t(), (term() -> {key(), value()})) :: map() Создает карту из enumerable с помощью заданной функции преобразования.
Дублирующиеся ключи удаляются; последний имеет приоритет.
Примеры
iex> Map.new([:a, :b], fn x -> {x, x} end)
%{a: :a, b: :b}
iex> Map.new(%{a: 2, b: 3, c: 4}, fn {key, val} -> {key, val * 2} end)
%{a: 4, b: 6, c: 8} pop(map, key, default \\ nil)Source
@spec pop(map(), key(), default) :: {value(), updated_map :: map()} | {default, map()}
when default: value() Удаляет значение, связанное с key в map и возвращает значение и обновленную карту.
Если key присутствует в map, возвращается {value, updated_map}, где value — значение ключа, а updated_map — результат удаления key из map. Если key отсутствует в map, возвращается {default, map}.
Примеры
iex> Map.pop(%{a: 1}, :a)
{1, %{}}
iex> Map.pop(%{a: 1}, :b)
{nil, %{a: 1}}
iex> Map.pop(%{a: 1}, :b, 3)
{3, %{a: 1}} pop!(map, key)Source
@spec pop!(map(), key()) :: {value(), updated_map :: map()} Удаляет значение, связанное с key в map и возвращает значение и обновленную карту, или вызывает исключение, если key отсутствует.
Ведет себя так же, как pop/3, но вызывает исключение, если key отсутствует в map.
Примеры
iex> Map.pop!(%{a: 1}, :a)
{1, %{}}
iex> Map.pop!(%{a: 1, b: 2}, :a)
{1, %{b: 2}}
iex> Map.pop!(%{a: 1}, :b)
** (KeyError) key :b not found in: %{a: 1} pop_lazy(map, key, fun)Source
@spec pop_lazy(map(), key(), (-> value())) :: {value(), map()} Лениво возвращает и удаляет значение, связанное с key в map.
Если key присутствует в map, возвращается {value, new_map}, где value — значение ключа, а new_map — результат удаления key из map. Если key отсутствует в map, возвращается {fun_result, map}, где fun_result — результат применения fun.
Это полезно, если значение по умолчанию очень дорого вычислять или его сложно настроить и удалить.
Примеры
iex> map = %{a: 1}
iex> fun = fn ->
...> # some expensive operation here
...> 13
...> end
iex> Map.pop_lazy(map, :a, fun)
{1, %{}}
iex> Map.pop_lazy(map, :b, fun)
{13, %{a: 1}} put(map, key, value)Source
@spec put(map(), key(), value()) :: map()
Помещает заданное value под key в map.
Встраивается компилятором.
Примеры
iex> Map.put(%{a: 1}, :b, 2)
%{a: 1, b: 2}
iex> Map.put(%{a: 1, b: 2}, :a, 3)
%{a: 3, b: 2} put_new(map, key, value)Source
@spec put_new(map(), key(), value()) :: map()
Помещает заданное value под key, если запись key еще не существует в map.
Примеры
iex> Map.put_new(%{a: 1}, :b, 2)
%{a: 1, b: 2}
iex> Map.put_new(%{a: 1, b: 2}, :a, 3)
%{a: 1, b: 2} put_new_lazy(map, key, fun)Source
@spec put_new_lazy(map(), key(), (-> value())) :: map()
Вычисляет fun и помещает результат под key в map, если key еще не присутствует.
Эта функция полезна, если вы хотите вычислить значение для размещения под key только если key еще не присутствует, например, когда значение дорого вычислять или его сложно настроить и удалить.
Примеры
iex> map = %{a: 1}
iex> fun = fn ->
...> # some expensive operation here
...> 3
...> end
iex> Map.put_new_lazy(map, :a, fun)
%{a: 1}
iex> Map.put_new_lazy(map, :b, fun)
%{a: 1, b: 3} reject(map, fun)Source
@spec reject(map(), ({key(), value()} -> as_boolean(term()))) :: map() Возвращает карту, исключая пары из map, для которых fun возвращает истинное значение.
См. также filter/2.
Примеры
iex> Map.reject(%{one: 1, two: 2, three: 3}, fn {_key, val} -> rem(val, 2) == 1 end)
%{two: 2} replace(map, key, value)Source
@spec replace(map(), key(), value()) :: map()
Помещает значение под key только если key уже существует в map.
Примеры
iex> Map.replace(%{a: 1, b: 2}, :a, 3)
%{a: 3, b: 2}
iex> Map.replace(%{a: 1}, :b, 2)
%{a: 1} replace!(map, key, value)Source
@spec replace!(map(), key(), value()) :: map()
Помещает значение под key только если key уже существует в map.
Если key не присутствует в map, генерируется исключение KeyError.
Встроенная компилятором.
Примеры
iex> Map.replace!(%{a: 1, b: 2}, :a, 3)
%{a: 3, b: 2}
iex> Map.replace!(%{a: 1}, :b, 2)
** (KeyError) key :b not found in: %{a: 1} replace_lazy(map, key, fun)Source
@spec replace_lazy(map(), key(), (existing_value :: value() -> new_value :: value())) :: map()
Заменяет значение под key с использованием заданной функции только если key уже существует в map.
В сравнении с replace/3, это может быть полезно, когда вычисление значения требует значительных затрат.
Если key не существует, исходный map возвращается без изменений.
Примеры
iex> Map.replace_lazy(%{a: 1, b: 2}, :a, fn v -> v * 4 end)
%{a: 4, b: 2}
iex> Map.replace_lazy(%{a: 1, b: 2}, :c, fn v -> v * 4 end)
%{a: 1, b: 2} split(map, keys)Source
@spec split(map(), [key()]) :: {map(), map()} Взятие всех записей, соответствующих заданным keys в map и извлечение их в отдельный map.
Возвращает кортеж с новым map и исходным map без удаленных ключей.
Ключи, для которых нет записей в map игнорируются.
Примеры
iex> Map.split(%{a: 1, b: 2, c: 3}, [:a, :c, :e])
{%{a: 1, c: 3}, %{b: 2}} split_with(map, fun)Source
@spec split_with(map(), ({key(), value()} -> as_boolean(term()))) :: {map(), map()} Разделяет map на два map согласно заданной функции fun.
fun получает каждую {key, value} пару в map в качестве единственного аргумента. Возвращает кортеж с первым map, содержащим все элементы в map для которых применение fun возвращает истинное значение, и вторым map со всеми элементами, для которых применение fun возвращает ложное значение (false или nil).
Примеры
iex> Map.split_with(%{a: 1, b: 2, c: 3, d: 4}, fn {_k, v} -> rem(v, 2) == 0 end)
{%{b: 2, d: 4}, %{a: 1, c: 3}}
iex> Map.split_with(%{a: 1, b: -2, c: 1, d: -3}, fn {k, _v} -> k in [:b, :d] end)
{%{b: -2, d: -3}, %{a: 1, c: 1}}
iex> Map.split_with(%{a: 1, b: -2, c: 1, d: -3}, fn {_k, v} -> v > 50 end)
{%{}, %{a: 1, b: -2, c: 1, d: -3}}
iex> Map.split_with(%{}, fn {_k, v} -> v > 50 end)
{%{}, %{}} take(map, keys)Source
@spec take(map(), [key()]) :: map()
Возвращает новый map со всеми парами ключ-значение в map где ключ есть в keys.
Если keys содержит ключи, которые не находятся в map, они просто игнорируются.
Примеры
iex> Map.take(%{a: 1, b: 2, c: 3}, [:a, :c, :e])
%{a: 1, c: 3} to_list(map)Source
@spec to_list(map()) :: [{term(), term()}] Преобразует map в список.
Каждая пара ключ-значение в map преобразуется в двухэлементный кортеж {key, value} в результирующем списке.
Встроенная компилятором.
Примеры
iex> Map.to_list(%{a: 1})
[a: 1]
iex> Map.to_list(%{1 => 2})
[{1, 2}] update(map, key, default, fun)Source
@spec update( map(), key(), default :: value(), (existing_value :: value() -> new_value :: value()) ) :: map()
Обновляет key в map с помощью заданной функции.
Если key присутствует в map, то существующее значение передается в fun, а его результат используется в качестве обновленного значения key. Если key не присутствует в map, default вставляется как значение key.
Значение по умолчанию не будет передано в функцию обновления.
Примеры
iex> Map.update(%{a: 1}, :a, 13, fn existing_value -> existing_value * 2 end)
%{a: 2}
iex> Map.update(%{a: 1}, :b, 11, fn existing_value -> existing_value * 2 end)
%{a: 1, b: 11} update!(map, key, fun)Source
@spec update!(map(), key(), (existing_value :: value() -> new_value :: value())) :: map()
Обновляет key с помощью заданной функции.
Если key присутствует в map , то существующее значение передается в fun, а его результат используется как обновленное значение key . Если key не присутствует в map, генерируется исключение KeyError.
Примеры
iex> Map.update!(%{a: 1}, :a, &(&1 * 2))
%{a: 2}
iex> Map.update!(%{a: 1}, :b, &(&1 * 2))
** (KeyError) key :b not found in: %{a: 1} values(map)Source
@spec values(map()) :: [value()]
Возвращает все значения из map.
Встроенная компилятором.
Примеры
iex> Map.values(%{a: 1, b: 2})
[1, 2]
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.15.4/Map.html