1> lists:map(fun(E) -> E * E end, [1, 2, 3, 4, 5]).
[1,4,9,16,25]
列表 List 里的每一个元素按从左向右的顺序被函数 Fun 调用,不同的是,每次函数 Fun 执行的结果将保留,并组成一个列表返回。
还有一个列表构造技巧写法:
[ X*X || X <- [1,2,3,4,5]].
[1,4,9,16,25]
同样能达到目的,那么来比较一下效率。
-module(t).
-export([test/0,timestamp/0]).
test()->
[ guess(fun a/2 ),guess(fun b/2 ) ].
guess(F)->
Start = timestamp(),
List = [1, 2, 3, 4, 5],
F(100000,List),
timestamp() - Start.
a(0,_)->0;
a(N,List) ->
[ X*X || X <- List],
a(N-1,List).
b(0,_)->0;
b(N,List) ->
lists:map(fun(E) -> E * E end, List),
b(N-1,List).
timestamp() ->
{M, S, Micr} = os:timestamp(),
1000000000000 * M + S * 10000000 + Micr.
我以为lists:map会更快,没想到列表构造比lists:map快一倍。看来以后要多用列表构造,少用api
4> t:test().
[12000,24000]
5> t:test().
[13000,23000]
6> t:test().
[12000,24000]
7> t:test().
[12000,23000]
8> t:test().
[12000,24000]
9> t:test().
[11000,24000]
10> t:test().
[11000,25000]
11> t:test().
[12000,24000]
12> t:test().
[12000,25000]
2> lists:foreach(fun(E) -> E * E end, [1, 2, 3, 4, 5]).
ok
正常返回ok,配合匿名函数做事情才好用。
4> lists:foldl(fun(X,Sum)->X+Sum end,0,[1,2,3,4,5]).
15
一个很有用的列表循环调用api,可以根据业务逻辑自定义初始化并且循环整个列表。