文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

今天的 Erlang Thursday 要讲的函数是 lists:any/2.

lists:any/2 接收一个断言函数作为第一个入参,一个将被遍历的列表作为第二个入参。如果这个断言函数对于任意一个给定列表的元素返回 true 的话lists:any/2 返回 true ,否则, lists:any/2 返回 false 。

lists:any(fun erlang:is_atom/1, [1, 2, 3, 4, 5, 6, 7]).
% false
lists:any(fun erlang:is_atom/1, [1, 2, 3, 4, a, 6, 7]).
% true
lists:any(fun erlang:is_atom/1, [{1, 2}, 3, 4, a, 6, 7]). 
% true
lists:any(fun(X) -> X rem 2 == 1 end, [1, 2, 4]).
% true
lists:any(fun(X) -> X rem 2 == 1 end, [0, 2, 4]).    
% false
第 1 段(可获 2 积分)

lists:any/2 是个急性子,只要它发现某个元素使得断言函数返回true,它就立即返回true,并且忽略剩下的列表元素。

timer:tc(lists, any, [fun(X) -> X rem 2 == 1 end, lists:seq(2, 200000, 2)]).
% {248410,false}
timer:tc(lists, any, [fun(X) -> X rem 2 == 0 end, lists:seq(2, 200000, 2)]).
% {13,true}

lists模块也包含 lists:all/2 函数,它和 lists:any/2 有点类似,不过它是通过断言函数检查每一个列表的元素,如果都返回true,则它就返回true。

lists:all(fun erlang:is_number/1, [1, 2, 3, 4, a, 6, 7]).
% false
lists:all(fun erlang:is_number/1, [1, 2, 3, 4, 5, 6, 7]).
% true
第 2 段(可获 2 积分)

lists:all/2 也是一个急性子,一旦某个列表元素使得断言函数返回false,它就立即返回false,并且忽略后续的列表元素。

timer:tc(lists, all, [fun(X) -> X rem 2 == 0 end, lists:seq(2, 200000, 2)]).
% {235276,true}
timer:tc(lists, all, [fun(X) -> X rem 2 == 1 end, lists:seq(2, 200000, 2)]).
% {14,false}

第 3 段(可获 2 积分)

文章评论