erlang-基本语法_4、映射的创建和更新、maps模块的处理

写在前面

本文主要是以一个erlang的学习记录,有错误的地方欢迎指正。


Snip20180615_22.png

映射 (Map)

映射组是键--值对的关联性集合。键可以是任意的Erlang数据类型。
键和值可以是任何有效的Erlang数据类型
注:map 要更新到最新的erl版本才能运行(R17版本的erlang 才添加map,所以致少要升到R17的版本)

%%Erlang R15B03  版本报错
➜  Cellar erl
Erlang R15B03 (erts-5.9.3.1) [source] [64-bit] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.3.1  (abort with ^G)
1> #{name =>"yzf" ,age=>26}. 
* 1: syntax error before: '{'
1> 
1> 
%%Erlang/OTP 19 版本可以执行成功
[root@iz7mrdaho3jf9lz otp_src_19.1]# erl
Erlang/OTP 19 [erts-8.1] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V8.1  (abort with ^G)
1> #{age => 26,name => "yzf"}.
#{age => 26,name => "yzf"}

创建映射组

Erlang 中的映射组用结构 #{} 表示

1> #{name => "youname", age=> 26}.
#{age => 26,name => "youname"}
%输出
2> #{}.
#{}
3> 

更新映射组

% => 用于创建或更新一个映射
13> Me = #{name =>"zyf",age =>26}.
#{age => 26,name => "zyf"}
14> NewMe = Me#{age => 20}.
#{age => 20,name => "zyf"}
15> Me.
#{age => 26,name => "zyf"}
16> 
16> #{name =>"zyf",age =>26}#{age =>27}.
#{age => 27,name => "zyf"}
17> 
% 使用 :=,它只能用来更新映射,而不能创建新的映射,如果键不存在,就会抛出一个 badarg 异常
1> Me = #{name =>"zyf",age =>26}.
#{age => 26,name => "zyf"}
2> Me#{age := 27}.               
#{age => 27,name => "zyf"}
3> Me#{aeg := 27}.
** exception error: {badkey,aeg}
     in function  maps:update/3
        called as maps:update(aeg,27,#{age => 26,name => "zyf"})
     in call from erl_eval:'-expr/5-fun-0-'/2 (erl_eval.erl, line 255)
     in call from lists:foldl/3 (lists.erl, line 1263)
4> 

将Map里的参数匹配出来

%部分匹配:
%只取出一个参数的映射
1> Me = #{age=> 19,name=>"zyfa"}.
#{age => 19,name => "zyfa"}
2> #{age := NewAge}=Me.
%重新匹配
#{age => 19,name => "zyfa"}
3> NewAge .
19
4> 
4> #{age => NewAge2}=Me.
* 2: illegal pattern
%用=>符号去匹配会报错
5> 

maps 模块

Erlang 中的 maps 模块用于操作映射组

映射组的创建及属性

%创建
6> maps:new().
#{}
%新建一个Me的映射
7> Me =#{age=>19,name=>"zyf"}.
#{age => 19,name => "zyf"}

%查询映射的所有键
8> maps:keys(Me).
[age,name]
9> 

%判断是否存在键
%存在时
10> maps:is_key(age,Me).
true
%不存在时
11> maps:is_key(age111,Me).
false

%查询出Me里面的所有值
12> maps:values(Me).
[19,"zyf"]

%查询映射里面的数量
13> maps:size(Me).
2
% erlang:map_size/1 此函数可以用于 Guard,maps 模块内部也是使用此函数的
14> map_size(Me).
2
15> 

映射的增加、删除、获取

% 获取映射里面的 age key 的值,找不到key时会报错
16> maps:get(age,Me).
19

% 查不到age123这个key的值,会报异常提示
17> maps:get(age123,Me).
** exception error: {badkey,age123}
     in function  maps:get/2
        called as maps:get(age123,#{age => 19,name => "zyf"})
18> 

% maps:get/3 在键不存在时会返回第三个参数的值
18> maps:get(age123,Me,18).
18


% 添加参数到映射里面,原映射组并不会改变
19> maps:put(gender,male,Me).
#{age => 19,gender => male,name => "zyf"}
20> Me.
#{age => 19,name => "zyf"}

% 用于更新映射,类似于 :=,键不存在时会抛出 badarg 异常
21> 
21> maps:update(age,20,Me).
#{age => 20,name => "zyf"}
22> maps:update(age321,20,Me).
** exception error: {badkey,age321}
     in function  maps:update/3
        called as maps:update(age321,20,#{age => 19,name => "zyf"})
23> 

% 删除一个映射,键不存在时相当于什么都没做,不会抛出异常
23> maps:remove(age,Me).
#{name => "zyf"}
24> 

% 查找键的值,键不存在时返回 error
24> maps:find(age,Me).
{ok,19}
25> Me.
#{age => 19,name => "zyf"}
26> maps:find(age3,Me).
error
27> 

映射组的归并

% 新建一个Me映射
1> Me=#{age=> 10,name=>"zyfaa"}.
#{age => 10,name => "zyfaa"}

%新建一个Me1映射
2> Me2=#{height=>173}. 
#{height => 173}

%将Me、Me2合并 height键会合并到新的映射里面
3> maps:merge(Me,Me2).
#{age => 10,height => 173,name => "zyfaa"}

%新建一个Me3映射,age为39
4> Me3=#{age=>39}.
#{age => 39}

%将Me、Me3合并 age会更新到最新的值
5> maps:merge(Me,Me3).
#{age => 39,name => "zyfaa"}

映射组与列表之间的转换

5> Me=#{age=> 10,name=>"zyfaa"}.
#{age => 10,name => "zyfaa"}

% 返回映射对应的列表
6> maps:to_list(Me).
[{age,10},{name,"zyfaa"}]

%从列表构建一个空的映射组
7> maps:from_list([]).
#{}
8> 

%从列表构建一个新的映射组
9> maps:from_list([{name,"zfsfd"},{age,33}]).      
#{age => 33,name => "zfsfd"}
10> Me21 = maps:from_list([{name,"zfsfd"},{age,33}]).
#{age => 33,name => "zfsfd"}
11> 

映射组的遍历

% 对映射组的每对映射执行操作
% X, Y 分别为一对映射的键和值
11> Me21 = maps:from_list([{name,"zfsfd"},{age,33}]).
#{age => 33,name => "zfsfd"}
12> maps:map(fun (X, Y) -> io:format("~p => ~p~n",[X, Y]) end,Me21).
age => 33
name => "zfsfd"
#{age => ok,name => ok}
13> 
% X, Y 分别为一对映射的键和值,V 为上一次迭代的结果,0 为迭代的初始值
% 这里简单的用于每次迭代时值加 1,结果就是映射组的映射数量
13> maps:fold(fun(X,Y,V) ->V + 1 end,0,Me).
2

映射组中映射的选取

1、返回第一个参数中指定的键的映射组成的映射组

14> maps:with([],Me).
#{}
15> maps:with([name],Me).
#{name => "zyfaa"}
16> maps:with([age],Me). 
#{age => 10}
17> 
17> maps:with([age22],Me).
#{}

2、返回键不再第一个参数的列表中的映射组成的映射组

18> maps:without([],Me).
#{age => 10,name => "zyfaa"}
19> 
19> maps:without([age],Me).
#{name => "zyfaa"}
20> maps:without([age,name],Me).
#{}
% 键也可以不存在
21> maps:without([age,name234],Me).
#{name => "zyfaa"}
22> 

注意

值得一提的是 maps 模块中的若干函数,比如 map, fold, with 和 without 都是使用 maps:to_list/1 转到列表,然后使用 lists 模块的工具处理,然后使用 maps:from_list/1 转回到映射组的。

引用网络博客内容:
https://blog.csdn.net/yangzm/article/details/50597409
https://www.w3cschool.cn/erlang/tohb1p5z.html (w3cschool erlang教程)

个人博客地址:https://zhangyongfeng1.github.io/
简书地址://www.greatytc.com/u/137f325832fb

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容

  • 世界是并行的,Erlang程序反应了我们思考和交流的方式,人作为个体通过发送消息进行交流,如果有人死亡,其他人会注...
    abel_cao阅读 2,766评论 1 4
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,523评论 0 4
  • 用到的组件 1、通过CocoaPods安装 2、第三方类库安装 3、第三方服务 友盟社会化分享组件 友盟用户反馈 ...
    SunnyLeong阅读 14,621评论 1 180
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,982评论 3 119
  • 今天是教师节,首先祝我和孩子的老师节日快乐!的确,老师是唯一的与我们没有血液关系,但她们的心情随着我们成绩而改...
    轩萌妈阅读 141评论 0 0