【erlang】lists模块循环调用api【map foreach foldl】和 列表构造

lists:map

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]

同样能达到目的,那么来比较一下效率。

lists:map和列表构造效率比较:

-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]

lists:foreach

2> lists:foreach(fun(E) -> E * E end, [1, 2, 3, 4, 5]).
ok

正常返回ok,配合匿名函数做事情才好用。

lists:foldl

4> lists:foldl(fun(X,Sum)->X+Sum end,0,[1,2,3,4,5]).
15

一个很有用的列表循环调用api,可以根据业务逻辑自定义初始化并且循环整个列表。

你可能感兴趣的:(erlang)