1. 要遍历map,我们可以用 maps:fold/3 , 或者先用 maps:to_list/1 然后再用 lists:foldl/3 ,maps:fold/3 的性能更好
2. 需要加工后的数据依然是一个map, 可以直接构建 map , 也可以先构建 list 再 maps:from_list/1 转成 map, 后一种方式性能更好
3. 测试代码
-module(t).
-export([t/0]).
t() ->
Data = [1, 2, 3, 4, 5, 6],
Map = lists:foldl(fun(Id, Tmp) ->
Tmp#{Id => Data}
end, #{}, lists:seq(1, 1000000)),
Fun1 = fun() ->
maps:from_list(lists:foldl(fun({Key, Val}, AccIn) ->
[{Key, [7 | Val]} | AccIn]
end, [], maps:to_list(Map)))
end,
Fun2 = fun() ->
maps:fold(fun(Key, Val, AccIn) ->
AccIn#{Key => [7 | Val]}
end, #{}, Map)
end,
Fun3 = fun() ->
maps:from_list(maps:fold(fun(Key, Val, AccIn) ->
[{Key, [7 | Val]} | AccIn]
end, [], Map))
end,
{Time1, _} = timer:tc(Fun1),
io:format("Time1: ~p~n", [Time1]),
{Time2, _} = timer:tc(Fun2),
io:format("Time2: ~p~n", [Time2]),
{Time3, _} = timer:tc(Fun3),
io:format("Time3: ~p~n", [Time3]),
ok.
4. 输出结果
Time1: 437006
Time2: 656009
Time3: 297004