查看源码 maps (stdlib v6.2)

映射处理函数。

此模块包含用于映射处理的函数。《效率指南》中有一章描述了如何高效地使用映射

概要

类型

一个迭代器,表示一个映射中的关联,其键的类型为 Key,值的类型为 Value

基于键的迭代器排序选项,可以是 undefined (对于 maps:iterator/1 的默认值)、ordered (按映射键排序)、reversed 或自定义排序函数。

函数

返回一个映射 Map,对于 MapOrIter 中的每一个元素,谓词 Pred 都为真。

返回一个映射 Map,它是对 MapOrIter 中每个 Key 到值 Value1 的关联按任意顺序调用 Fun(Key, Value1) 的结果。

返回一个元组 {ok, Value},其中 Value 是与 Key 关联的值;如果 Map 中没有与 Key 关联的值,则返回 error

MapOrIter 中每个 Key 到值 Value 的关联按任意顺序调用 F(Key, Value, AccIn)。函数 fun F/3 必须返回一个新的累加器,该累加器被传递给下一个连续的调用。此函数返回累加器的最终值。如果映射为空,则返回初始累加器值 Init

MapOrIter 中每个 Key 到值 Value 的关联按任意顺序调用 fun F(Key, Value)

接受一个键列表和一个值,并构建一个映射,其中所有键都指向同一个值。键可以是任意顺序,并且键和值可以是任意项。

接受一个键值元组元素列表并构建一个映射。关联可以是任意顺序,并且关联中的键和值都可以是任意项。

如果 Map 包含 Key,则返回与 Key 关联的值 Value

如果 Map 包含 Key,则返回与 Key 关联的值 Value。如果没有与 Key 关联的值,则返回 Default

将给定的 List 分区到一组映射中。

将给定的 List 分区到一组映射中。

将两个映射相交为一个映射 Map3。如果一个键存在于两个映射中,则 Map1 中的值将被 Map2 中的值取代。

将两个映射相交为一个映射 Map3。如果一个键存在于两个映射中,则 Map1 中的值将与 Map2 中的值通过 Combiner 函数组合。

如果映射 Map 包含 Key,则返回 true;如果它不包含 Key,则返回 false

返回一个映射迭代器 Iteratormaps:next/1 可以使用它来遍历映射中的键值关联。当遍历一个映射时,无论映射的大小如何,内存使用都保证是有界的。

返回一个映射迭代器 Iteratormaps:next/1 可以使用它来遍历映射中的键值关联,并使用给定的 Order 按键排序。

返回 Map 中所有键的完整列表,顺序任意。

通过对 MapOrIter 中每个 Key 到值 Value1 的关联按任意顺序调用函数 fun F(Key, Value1) 来生成一个新的映射 Map。函数 fun Fun/2 必须返回值 Value2,该值将与新映射 Map 的键 Key 关联。

将两个映射合并为一个映射 Map3。如果两个键存在于两个映射中,则 Map1 中的值将被 Map2 中的值取代。

将两个映射合并为一个映射 Map3。如果一个键存在于两个映射中,则 Map1 中的值将与 Map2 中的值通过 Combiner 函数组合。

返回一个新的空映射。

返回 Iterator 中的下一个键值关联和一个新的迭代器,用于迭代器中剩余的关联。

Key 与值 Value 关联,并将该关联插入到映射 Map2 中。如果键 Key 已经存在于映射 Map1 中,则旧的关联值将被值 Value 替换。该函数返回一个新映射 Map2,其中包含新的关联和 Map1 中的旧关联。

Map1 中删除 Key(如果存在)及其关联的值,并返回一个不包含键 Key 的新映射 Map2

返回 Map 中键值关联的数量。此操作以恒定时间完成。

该函数从 Map1 中删除 Key(如果存在)及其关联的值,并返回一个元组,其中包含删除的 Value 和不包含键 Key 的新映射 Map2。如果键不存在,则返回 error

返回一个表示 MapOrIterator 的键值关联的对列表,其中对 [{K1,V1}, ..., {Kn,Vn}] 以任意顺序返回。

如果 Key 存在于 Map1 中,则旧的关联值将被值 Value 替换。该函数返回一个包含新关联值的新映射 Map2

通过对旧值调用 Fun 来获取新值,从而更新 Map1 中与 Key 关联的值。如果 Key 不在映射中,则会生成一个异常 {badkey,Key}

通过对旧值调用 Fun 来获取新值,从而更新 Map1 中与 Key 关联的值。如果 Key 不在 Map1 中,则 Init 将与 Key 关联。

返回映射 Map 中包含的所有值的完整列表,顺序任意。

返回一个新映射 Map2,其中包含键 K1Kn 以及它们在映射 Map1 中的关联值。Ks 中任何不存在于 Map1 中的键都将被忽略。

返回一个新映射 Map2,其中不包含来自映射 Map1 的键 K1Kn 及其关联的值。Ks 中任何不存在于 Map1 中的键都将被忽略。

类型

链接到此类型

iterator()

查看源码 (自 OTP 17.0 起)
-type iterator() :: iterator(term(), term()).
链接到此不透明类型

iterator(Map, Order)

查看源码 (自 OTP 17.0 起)
-opaque iterator(Key, Value)

一个迭代器,表示一个映射中的关联,其键的类型为 Key,值的类型为 Value

使用 maps:iterator/1maps:iterator/2 创建。

由以下项使用

链接到此类型

iterator_order()

查看源码 (自 OTP 17.0 起)
-type iterator_order() :: iterator_order(term()).
链接到此类型

iterator_order(Key)

查看源码 (自 OTP 17.0 起)
-type iterator_order(Key) :: undefined | ordered | reversed | fun((A :: Key, B :: Key) -> boolean()).

基于键的迭代器排序选项,可以是 undefined (对于 maps:iterator/1 的默认值)、ordered (按映射键排序)、reversed 或自定义排序函数。

maps:iterator/2 使用。

表达式部分 包含关于如何对项进行排序的描述。

函数

此函数的链接

filter(Pred, MapOrIter)

查看源代码 (自 OTP 18.0 起)
-spec filter(Pred, MapOrIter) -> Map
                when
                    Pred :: fun((Key, Value) -> boolean()),
                    MapOrIter :: #{Key => Value} | iterator(Key, Value),
                    Map :: #{Key => Value}.

返回一个映射 Map,对于 MapOrIter 中的每一个元素,谓词 Pred 都为真。

如果 MapOrIter 不是映射或有效的迭代器,则调用会失败并抛出 {badmap,Map} 异常;如果 Pred 不是一个arity 为 2 的函数,则会抛出 badarg 异常。

示例

> M = #{a => 2, b => 3, c=> 4, "a" => 1, "b" => 2, "c" => 4},
  Pred = fun(K,V) -> is_atom(K) andalso (V rem 2) =:= 0 end,
  maps:filter(Pred,M).
#{a => 2,c => 4}
此函数的链接

filtermap(Fun, MapOrIter)

查看源代码 (自 OTP 24.0 起)
-spec filtermap(Fun, MapOrIter) -> Map
                   when
                       Fun :: fun((Key, Value1) -> boolean() | {true, Value2}),
                       MapOrIter :: #{Key => Value1} | iterator(Key, Value1),
                       Map :: #{Key => Value1 | Value2}.

返回一个映射 Map,它是对 MapOrIter 中每个 Key 到值 Value1 的关联按任意顺序调用 Fun(Key, Value1) 的结果。

如果 Fun(Key, Value1) 返回 true,则该关联会被复制到结果映射中。 如果它返回 false,则该关联不会被复制。 如果它返回 {true, NewValue},则 Key 的值在结果映射中会被替换为 NewValue

如果 MapOrIter 不是映射或有效的迭代器,则调用会失败并抛出 {badmap,Map} 异常;如果 Fun 不是一个arity 为 2 的函数,则会抛出 badarg 异常。

示例

> Fun = fun(K,V) when is_atom(K) -> {true, V*2}; (_,V) -> (V rem 2) =:= 0 end,
  Map = #{k1 => 1, "k2" => 2, "k3" => 3},
  maps:filtermap(Fun,Map).
#{k1 => 2,"k2" => 2}
此函数的链接

find(Key, Map)

查看源代码 (自 OTP 17.0 起)
-spec find(Key, Map) -> {ok, Value} | error when Map :: #{Key => Value, _ => _}.

返回一个元组 {ok, Value},其中 Value 是与 Key 关联的值;如果 Map 中没有与 Key 关联的值,则返回 error

如果 Map 不是映射,则调用会失败并抛出 {badmap,Map} 异常。

示例

> Map = #{"hi" => 42},
  Key = "hi",
  maps:find(Key,Map).
{ok,42}
此函数的链接

fold(Fun, Init, MapOrIter)

查看源代码 (自 OTP 17.0 起)
-spec fold(Fun, Init, MapOrIter) -> Acc
              when
                  Fun :: fun((Key, Value, AccIn) -> AccOut),
                  Init :: term(),
                  Acc :: AccOut,
                  AccIn :: Init | AccOut,
                  MapOrIter :: #{Key => Value} | iterator(Key, Value).

MapOrIter 中每个 Key 到值 Value 的关联按任意顺序调用 F(Key, Value, AccIn)。函数 fun F/3 必须返回一个新的累加器,该累加器被传递给下一个连续的调用。此函数返回累加器的最终值。如果映射为空,则返回初始累加器值 Init

如果 MapOrIter 不是映射或有效的迭代器,则调用会失败并抛出 {badmap,Map} 异常;如果 Fun 不是一个arity 为 3 的函数,则会抛出 badarg 异常。

示例

> Fun = fun(K,V,AccIn) when is_list(K) -> AccIn + V end,
  Map = #{"k1" => 1, "k2" => 2, "k3" => 3},
  maps:fold(Fun,0,Map).
6
此函数的链接

foreach(Fun, MapOrIter)

查看源代码 (自 OTP 24.0 起)
-spec foreach(Fun, MapOrIter) -> ok
                 when
                     Fun :: fun((Key, Value) -> term()),
                     MapOrIter :: #{Key => Value} | iterator(Key, Value).

MapOrIter 中每个 Key 到值 Value 的关联按任意顺序调用 fun F(Key, Value)

如果 MapOrIter 不是映射或有效的迭代器,则调用会失败并抛出 {badmap,Map} 异常;如果 Fun 不是一个arity 为 2 的函数,则会抛出 badarg 异常。

此函数的链接

from_keys(Keys, Value)

查看源代码 (自 OTP 24.0 起)
-spec from_keys(Keys, Value) -> Map when Keys :: list(), Value :: term(), Map :: map().

接受一个键列表和一个值,并构建一个映射,其中所有键都指向同一个值。键可以是任意顺序,并且键和值可以是任意项。

示例

> Keys = ["a", "b", "c"], maps:from_keys(Keys, ok).
#{"a" => ok,"b" => ok,"c" => ok}
此函数的链接

from_list(List)

查看源代码 (自 OTP 17.0 起)
-spec from_list(List) -> Map when List :: [{Key, Value}], Key :: term(), Value :: term(), Map :: map().

接受一个键值元组元素列表并构建一个映射。关联可以是任意顺序,并且关联中的键和值都可以是任意项。

如果同一个键出现多次,则使用后者(最右边的)值,而忽略之前的值。

示例

> List = [{"a",ignored},{1337,"value two"},{42,value_three},{"a",1}],
  maps:from_list(List).
#{42 => value_three,1337 => "value two","a" => 1}
此函数的链接

get(Key, Map)

查看源代码 (自 OTP 17.0 起)
-spec get(Key, Map) -> Value when Key :: term(), Map :: map(), Value :: term().

如果 Map 包含 Key,则返回与 Key 关联的值 Value

如果 Map 不是映射,则调用会失败并抛出 {badmap,Map} 异常;如果 Key 没有关联的值,则会抛出 {badkey,Key} 异常。

示例

> Key = 1337,
  Map = #{42 => value_two,1337 => "value one","a" => 1},
  maps:get(Key,Map).
"value one"
此函数的链接

get(Key, Map, Default)

查看源代码 (自 OTP 17.1 起)
-spec get(Key, Map, Default) -> Value | Default when Map :: #{Key => Value, _ => _}.

如果 Map 包含 Key,则返回与 Key 关联的值 Value。如果没有与 Key 关联的值,则返回 Default

如果 Map 不是映射,则调用会失败并抛出 {badmap,Map} 异常。

示例

> Map = #{ key1 => val1, key2 => val2 }.
#{key1 => val1,key2 => val2}
> maps:get(key1, Map, "Default value").
val1
> maps:get(key3, Map, "Default value").
"Default value"
此函数的链接

groups_from_list(KeyFun, List)

查看源代码 (自 OTP 25.0 起)
-spec groups_from_list(KeyFun, List) -> GroupsMap
                          when
                              KeyFun :: fun((Elem) -> Key),
                              GroupsMap :: #{Key => Group},
                              Key :: term(),
                              List :: [Elem],
                              Group :: [Elem],
                              Elem :: term().

将给定的 List 分区到一组映射中。

结果是一个映射,其中每个键由 KeyFun 给出,每个值是给定 ListKeyFun 返回相同键的元素的列表。

每个组列表中的元素顺序与原始列表中的顺序一致。

示例

> EvenOdd = fun(X) -> case X rem 2 of 0 -> even; 1 -> odd end end,
maps:groups_from_list(EvenOdd, [1, 2, 3]).
#{even => [2], odd => [1, 3]}
> maps:groups_from_list(fun erlang:length/1, ["ant", "buffalo", "cat", "dingo"]).
#{3 => ["ant", "cat"], 5 => ["dingo"], 7 => ["buffalo"]}
此函数的链接

groups_from_list(KeyFun, ValueFun, List)

查看源代码 (自 OTP 25.0 起)
-spec groups_from_list(KeyFun, ValueFun, List) -> GroupsMap
                          when
                              KeyFun :: fun((Elem) -> Key),
                              ValueFun :: fun((Elem) -> Value),
                              GroupsMap :: #{Key := Group},
                              Key :: term(),
                              Value :: term(),
                              List :: [Elem],
                              Group :: [Value],
                              Elem :: term().

将给定的 List 分区到一组映射中。

结果是一个映射,其中每个键由 KeyFun 给出,每个值是给定 List 中通过 ValueFun 映射的元素的列表,这些元素的 KeyFun 返回相同的键。

每个组列表中的元素顺序与原始列表中的顺序一致。

示例

> EvenOdd = fun(X) -> case X rem 2 of 0 -> even; 1 -> odd end end,
> Square = fun(X) -> X * X end,
> maps:groups_from_list(EvenOdd, Square, [1, 2, 3]).
#{even => [4], odd => [1, 9]}
> maps:groups_from_list(
    fun erlang:length/1,
    fun lists:reverse/1,
    ["ant", "buffalo", "cat", "dingo"]).
#{3 => ["tna", "tac"],5 => ["ognid"],7 => ["olaffub"]}
此函数的链接

intersect(Map1, Map2)

查看源代码 (自 OTP 24.0 起)
-spec intersect(Map1, Map2) -> Map3
                   when Map1 :: #{Key => term()}, Map2 :: #{term() => Value2}, Map3 :: #{Key => Value2}.

将两个映射相交为一个映射 Map3。如果一个键存在于两个映射中,则 Map1 中的值将被 Map2 中的值取代。

如果 Map1Map2 不是映射,则调用会失败并抛出 {badmap,Map} 异常。

示例

> Map1 = #{a => "value_one", b => "value_two"},
  Map2 = #{a => 1, c => 2},
  maps:intersect(Map1,Map2).
#{a => 1}
此函数的链接

intersect_with(Combiner, Map1, Map2)

查看源代码 (自 OTP 24.0 起)
-spec intersect_with(Combiner, Map1, Map2) -> Map3
                        when
                            Map1 :: #{Key => Value1},
                            Map2 :: #{term() => Value2},
                            Combiner :: fun((Key, Value1, Value2) -> CombineResult),
                            Map3 :: #{Key => CombineResult}.

将两个映射相交为一个映射 Map3。如果一个键存在于两个映射中,则 Map1 中的值将与 Map2 中的值通过 Combiner 函数组合。

当应用 Combiner 时,在两个映射中都存在的键是第一个参数,来自 Map1 的值是第二个参数,来自 Map2 的值是第三个参数。

如果 Map1Map2 不是映射,则调用会失败并抛出 {badmap,Map} 异常。 如果 Combiner 不是一个接受三个参数的函数,则调用会失败并抛出 badarg 异常。

示例

> Map1 = #{a => "value_one", b => "value_two"},
  Map2 = #{a => 1, c => 2},
  maps:intersect_with(fun(_Key, Value1, Value2) -> {Value1, Value2} end, Map1, Map2).
#{a => {"value_one",1}}
此函数的链接

is_key(Key, Map)

查看源代码 (自 OTP 17.0 起)
-spec is_key(Key, Map) -> boolean() when Key :: term(), Map :: map().

如果映射 Map 包含 Key,则返回 true;如果它不包含 Key,则返回 false

如果 Map 不是映射,则调用会失败并抛出 {badmap,Map} 异常。

示例

> Map = #{"42" => value}.
#{"42" => value}
> maps:is_key("42",Map).
true
> maps:is_key(value,Map).
false
此函数的链接

iterator(Map)

查看源代码 (自 OTP 21.0 起)
-spec iterator(Map) -> Iterator when Map :: #{Key => Value}, Iterator :: iterator(Key, Value).

返回一个映射迭代器 Iteratormaps:next/1 可以使用它来遍历映射中的键值关联。当遍历一个映射时,无论映射的大小如何,内存使用都保证是有界的。

如果 Map 不是映射,则调用会失败并抛出 {badmap,Map} 异常。

示例

> M = #{ a => 1, b => 2 }.
#{a => 1,b => 2}
> I = maps:iterator(M), ok.
ok
> {K1, V1, I2} = maps:next(I), {K1, V1}.
{a,1}
> {K2, V2, I3} = maps:next(I2),{K2, V2}.
{b,2}
> maps:next(I3).
none
此函数的链接

iterator(Map, Order)

查看源代码 (自 OTP 26.0 起)
-spec iterator(Map, Order) -> Iterator
                  when
                      Map :: #{Key => Value},
                      Order :: iterator_order(Key),
                      Iterator :: iterator(Key, Value).

返回一个映射迭代器 Iteratormaps:next/1 可以使用它来遍历映射中的键值关联,并使用给定的 Order 按键排序。

如果 Map 不是映射或者 Order 无效,则调用会失败并抛出 {badmap,Map} 异常。

示例 (当 Orderordered 时):

> M = #{ a => 1, b => 2 }.
#{a => 1,b => 2}
> OrdI = maps:iterator(M, ordered), ok.
ok
> {K1, V1, OrdI2} = maps:next(OrdI), {K1, V1}.
{a,1}
> {K2, V2, OrdI3} = maps:next(OrdI2),{K2, V2}.
{b,2}
> maps:next(OrdI3).
none

示例 (当 Orderreversed 时):

> M = #{ a => 1, b => 2 }.
#{a => 1,b => 2}
> RevI = maps:iterator(M, reversed), ok.
ok
> {K2, V2, RevI2} = maps:next(RevI), {K2, V2}.
{b,2}
> {K1, V1, RevI3} = maps:next(RevI2),{K1, V1}.
{a,1}
> maps:next(RevI3).
none

示例 (当 Order 是一个算术排序函数时):

> M = #{ -1 => a, -1.0 => b, 0 => c, 0.0 => d }.
#{-1 => a,0 => c,-1.0 => b,0.0 => d}
> ArithOrdI = maps:iterator(M, fun(A, B) -> A =< B end), ok.
ok
> maps:to_list(ArithOrdI).
[{-1,a},{-1.0,b},{0,c},{0.0,d}]
> ArithRevI = maps:iterator(M, fun(A, B) -> B < A end), ok.
ok
> maps:to_list(ArithRevI).
[{0.0,d},{0,c},{-1.0,b},{-1,a}]
此函数的链接

keys(Map)

查看源代码 (自 OTP 17.0 起)
-spec keys(Map) -> Keys when Map :: #{Key => _}, Keys :: [Key].

返回 Map 中所有键的完整列表,顺序任意。

如果 Map 不是映射,则调用会失败并抛出 {badmap,Map} 异常。

示例

> Map = #{42 => value_three,1337 => "value two","a" => 1},
  maps:keys(Map).
[42,1337,"a"]
此函数的链接

map(Fun, MapOrIter)

查看源代码 (自 OTP 17.0 起)
-spec map(Fun, MapOrIter) -> Map
             when
                 Fun :: fun((Key, Value1) -> Value2),
                 MapOrIter :: #{Key => Value1} | iterator(Key, Value1),
                 Map :: #{Key => Value2}.

通过对 MapOrIter 中每个 Key 到值 Value1 的关联按任意顺序调用函数 fun F(Key, Value1) 来生成一个新的映射 Map。函数 fun Fun/2 必须返回值 Value2,该值将与新映射 Map 的键 Key 关联。

如果 MapOrIter 不是映射或有效的迭代器,则调用会失败并抛出 {badmap,Map} 异常;如果 Fun 不是一个arity 为 2 的函数,则会抛出 badarg 异常。

示例

> Fun = fun(K,V1) when is_list(K) -> V1*2 end,
  Map = #{"k1" => 1, "k2" => 2, "k3" => 3},
  maps:map(Fun,Map).
#{"k1" => 2,"k2" => 4,"k3" => 6}
此函数的链接

merge(Map1, Map2)

查看源代码 (自 OTP 17.0 起)
-spec merge(Map1, Map2) -> Map3 when Map1 :: map(), Map2 :: map(), Map3 :: map().

将两个映射合并为一个映射 Map3。如果两个键存在于两个映射中,则 Map1 中的值将被 Map2 中的值取代。

如果 Map1Map2 不是映射,则调用会失败并抛出 {badmap,Map} 异常。

示例

> Map1 = #{a => "value_one", b => "value_two"},
  Map2 = #{a => 1, c => 2},
  maps:merge(Map1,Map2).
#{a => 1,b => "value_two",c => 2}
此函数的链接

merge_with(Combiner, Map1, Map2)

查看源代码 (自 OTP 24.0 起)
-spec merge_with(Combiner, Map1, Map2) -> Map3
                    when
                        Map1 :: #{Key1 => Value1},
                        Map2 :: #{Key2 => Value2},
                        Combiner :: fun((Key1, Value1, Value2) -> CombineResult),
                        Map3 :: #{Key1 => CombineResult, Key1 => Value1, Key2 => Value2}.

将两个映射合并为一个映射 Map3。如果一个键存在于两个映射中,则 Map1 中的值将与 Map2 中的值通过 Combiner 函数组合。

当应用 Combiner 时,在两个映射中都存在的键是第一个参数,来自 Map1 的值是第二个参数,来自 Map2 的值是第三个参数。

如果 Map1Map2 不是映射,则调用会失败并抛出 {badmap,Map} 异常。 如果 Combiner 不是一个接受三个参数的函数,则调用会失败并抛出 badarg 异常。

示例

> Map1 = #{a => "value_one", b => "value_two"},
  Map2 = #{a => 1, c => 2},
  maps:merge_with(fun(_Key, Value1, Value2) -> {Value1, Value2} end, Map1, Map2).
#{a => {"value_one",1},b => "value_two",c => 2}
此函数的链接

new()

查看源代码 (自 OTP 17.0 起)
-spec new() -> Map when Map :: #{}.

返回一个新的空映射。

示例

> maps:new().
#{}
此函数的链接

next(Iterator)

查看源代码 (自 OTP 21.0 起)
-spec next(Iterator) -> {Key, Value, NextIterator} | none
              when Iterator :: iterator(Key, Value), NextIterator :: iterator(Key, Value).

返回 Iterator 中的下一个键值关联和一个新的迭代器,用于迭代器中剩余的关联。

如果迭代器中没有更多关联,则返回 none

示例

> Map = #{a => 1, b => 2, c => 3}.
#{a => 1,b => 2,c => 3}
> I = maps:iterator(Map), ok.
ok
> {K1, V1, I1} = maps:next(I), {K1, V1}.
{a,1}
> {K2, V2, I2} = maps:next(I1), {K2, V2}.
{b,2}
> {K3, V3, I3} = maps:next(I2), {K3, V3}.
{c,3}
> maps:next(I3).
none
此函数的链接

put(Key, Value, Map1)

查看源代码 (自 OTP 17.0 起)
-spec put(Key, Value, Map1) -> Map2 when Key :: term(), Value :: term(), Map1 :: map(), Map2 :: map().

Key 与值 Value 关联,并将该关联插入到映射 Map2 中。如果键 Key 已经存在于映射 Map1 中,则旧的关联值将被值 Value 替换。该函数返回一个新映射 Map2,其中包含新的关联和 Map1 中的旧关联。

如果 Map1 不是映射,则调用会失败并抛出 {badmap,Map} 异常。

示例

> Map = #{"a" => 1}.
#{"a" => 1}
> maps:put("a", 42, Map).
#{"a" => 42}
> maps:put("b", 1337, Map).
#{"a" => 1,"b" => 1337}
此函数的链接

remove(Key, Map1)

查看源代码 (自 OTP 17.0 起)
-spec remove(Key, Map1) -> Map2 when Key :: term(), Map1 :: map(), Map2 :: map().

Map1 中删除 Key(如果存在)及其关联的值,并返回一个不包含键 Key 的新映射 Map2

如果 Map1 不是映射,则调用会失败并抛出 {badmap,Map} 异常。

示例

> Map = #{"a" => 1}.
#{"a" => 1}
> maps:remove("a",Map).
#{}
> maps:remove("b",Map).
#{"a" => 1}
此函数的链接

size(Map)

查看源代码 (自 OTP 17.0 起)
-spec size(Map) -> non_neg_integer() when Map :: map().

返回 Map 中键值关联的数量。此操作以恒定时间完成。

示例

> Map = #{42 => value_two,1337 => "value one","a" => 1},
  maps:size(Map).
3
此函数的链接

take(Key, Map1)

查看源代码 (自 OTP 19.0 起)
-spec take(Key, Map1) -> {Value, Map2} | error when Map1 :: #{Key => Value, _ => _}, Map2 :: #{_ => _}.

该函数从 Map1 中删除 Key(如果存在)及其关联的值,并返回一个元组,其中包含删除的 Value 和不包含键 Key 的新映射 Map2。如果键不存在,则返回 error

如果 Map1 不是映射,则调用会失败并抛出 {badmap,Map} 异常。

示例

> Map = #{"a" => "hello", "b" => "world"}.
#{"a" => "hello", "b" => "world"}
> maps:take("a",Map).
{"hello",#{"b" => "world"}}
> maps:take("does not exist",Map).
error
此函数的链接

to_list(MapOrIterator)

查看源代码 (自 OTP 17.0 起)
-spec to_list(MapOrIterator) -> [{Key, Value}]
                 when MapOrIterator :: #{Key => Value} | iterator(Key, Value).

返回一个表示 MapOrIterator 的键值关联的对列表,其中对 [{K1,V1}, ..., {Kn,Vn}] 以任意顺序返回。

如果 MapOrIterator 不是映射或通过调用 iterator/1iterator/2 获得的迭代器,则调用会失败并抛出 {badmap,Map} 异常。

示例

> Map = #{42 => value_three,1337 => "value two","a" => 1},
  maps:to_list(Map).
[{42,value_three},{1337,"value two"},{"a",1}]

示例 (使用 iterator/2):

> Map = #{ z => 1, y => 2, x => 3 }.
#{x => 3,y => 2,z => 1}
> maps:to_list(maps:iterator(Map, ordered)).
[{x,3},{y,2},{z,1}]
此函数的链接

update(Key, Value, Map1)

查看源代码 (自 OTP 17.0 起)
-spec update(Key, Value, Map1) -> Map2 when Map1 :: #{Key := _, _ => _}, Map2 :: #{Key := Value, _ => _}.

如果 Key 存在于 Map1 中,则旧的关联值将被值 Value 替换。该函数返回一个包含新关联值的新映射 Map2

如果 Map1 不是映射,则调用会失败并抛出 {badmap,Map} 异常;如果 Key 没有关联的值,则会抛出 {badkey,Key} 异常。

示例

> Map = #{"a" => 1}.
#{"a" => 1}
> maps:update("a", 42, Map).
#{"a" => 42}
此函数的链接

update_with(Key, Fun, Map1)

查看源代码 (自 OTP 19.0 起)
-spec update_with(Key, Fun, Map1) -> Map2
                     when
                         Map1 :: #{Key := Value1, _ => _},
                         Map2 :: #{Key := Value2, _ => _},
                         Fun :: fun((Value1) -> Value2).

通过对旧值调用 Fun 来获取新值,从而更新 Map1 中与 Key 关联的值。如果 Key 不在映射中,则会生成一个异常 {badkey,Key}

示例

> Map = #{"counter" => 1},
  Fun = fun(V) -> V + 1 end,
  maps:update_with("counter",Fun,Map).
#{"counter" => 2}
此函数的链接

update_with(Key, Fun, Init, Map1)

查看源代码 (自 OTP 19.0 起)
-spec update_with(Key, Fun, Init, Map1) -> Map2
                     when
                         Map1 :: #{Key => Value1, _ => _},
                         Map2 :: #{Key := Value2 | Init, _ => _},
                         Fun :: fun((Value1) -> Value2).

通过对旧值调用 Fun 来获取新值,从而更新 Map1 中与 Key 关联的值。如果 Key 不在 Map1 中,则 Init 将与 Key 关联。

示例

> Map = #{"counter" => 1},
  Fun = fun(V) -> V + 1 end,
  maps:update_with("new counter",Fun,42,Map).
#{"counter" => 1,"new counter" => 42}
此函数的链接

values(Map)

查看源代码 (自 OTP 17.0 起)
-spec values(Map) -> Values when Map :: #{_ => Value}, Values :: [Value].

返回映射 Map 中包含的所有值的完整列表,顺序任意。

如果 Map 不是映射,则调用会失败并抛出 {badmap,Map} 异常。

示例

> Map = #{42 => value_three,1337 => "value two","a" => 1},
  maps:values(Map).
[value_three,"value two",1]
此函数的链接

with(Ks, Map1)

查看源代码 (自 OTP 17.3 起)
-spec with(Ks, Map1) -> Map2 when Ks :: [K], Map1 :: #{K => V, _ => _}, Map2 :: #{K => V}.

返回一个新映射 Map2,其中包含键 K1Kn 以及它们在映射 Map1 中的关联值。Ks 中任何不存在于 Map1 中的键都将被忽略。

示例

> Map = #{42 => value_three,1337 => "value two","a" => 1},
  Ks = ["a",42,"other key"],
  maps:with(Ks,Map).
#{42 => value_three,"a" => 1}
此函数的链接

without(Ks, Map1)

查看源代码 (自 OTP 17.0 起)
-spec without(Ks, Map1) -> Map2 when Ks :: [K], Map1 :: map(), Map2 :: map(), K :: term().

返回一个新映射 Map2,其中不包含来自映射 Map1 的键 K1Kn 及其关联的值。Ks 中任何不存在于 Map1 中的键都将被忽略。

示例

> Map = #{42 => value_three,1337 => "value two","a" => 1},
  Ks = ["a",42,"other key"],
  maps:without(Ks,Map).
#{1337 => "value two"}