maps
适用于需要在运行时改变数据结构(record则不行)的场景,可以动态增加key
数据量不宜过大,具体多大没有实际数据,
maps from_list 如果list表很长,则相应的耗时时间会很长,此时最好用lists模块。
由于map是动态结构,速度上必然无法匹敌record。
内存大小介于tuple与list之间
lists:sort([1,#{}, {}, []]).
[1,{},#{},[]]
Operations | Records | Maps | Dict |
Immutable | ✓ | ✓ | ✓ |
Keys of any type | ✓ | ✓ | |
Usable with maps/folds | ✓ | ✓ | |
Content opaque to other modules | ✓ | ||
Has a module to use it | ✓ | ✓ | |
Supports pattern matching | ✓ | ✓ | |
All keys known at compile-time | ✓ | ||
Can merge with other instance | ✓ | ✓ | |
Testing for presence of a key | ✓ | ✓ | |
Extract value by key | ✓ | ✓ | ✓ |
Per-key Dialyzer type-checking | ✓ | * | |
Conversion from/to lists | ✓ | ✓ | |
Per-element default values | ✓ | ||
Standalone data type at runtime | ✓ | ||
Fast direct-index access | ✓ |
* The EEP recommends making this possible for keys known at compile-time, but has no ETA on when or if this will happen.
示例代码
-module (test). -compile([export_all]). % maps: % find/2 fold/3 from_list/1 get/2 get/3 % is_key/2 keys/1 map/2 merge/2 module_info/0 % module_info/1 new/0 put/3 remove/2 size/1 % to_list/1 update/3 values/1 with/2 without/2 start() -> A = #{k1 => 1, k2 => 2, k3 => 3}, #{k1 := K1} = A, A1 = A#{ k1 := K1 + 1}. % make() -> % maps: new | from_list M1 = maps:new(), % insert new one M2 = M1#{ k1 => 1}, % update M3 = M2#{ k1 := 2}, % maps 模块封装了一些函数 maps:put(k2, 2, M3). % 匹配 match(#{k1 := K1}) -> io:format("~p ~n", [K1]); match(#{nothing := N}) -> io:format("~p ~n", [N]). raw() -> [ {I, I}|| I <- lists:seq(1, 10000000)]. get() -> L = raw(), lists:keyfind(999, 1, L). get2() -> M = maps:from_list(raw()), maps:get(999, M).
更多阅读:
http://learnyousomeerlang.com/maps
http://erlang.org/doc/man/maps.html