Erlang Thursday - lists:any/2

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

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

1
2
3
4
5
6
7
8
9
10
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

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

1
2
3
4
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。

1
2
3
4
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

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

1
2
3
4
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}

原文链接: https://www.proctor-it.com/erlang-thursday-lists-any-2/