lists:filtermap/2
过滤并映射操作符合函数条件的元素
用法:
filtermap(Fun, List1) -> List2
内部实现:
-spec filtermap(Fun, List1) -> List2 when
Fun :: fun((Elem) -> boolean() | {'true', Value}),
List1 :: [Elem],
List2 :: [Elem | Value],
Elem :: term(),
Value :: term().
filtermap(F, [Hd|Tail]) ->
case F(Hd) of
true ->
[Hd|filtermap(F, Tail)];
{true,Val} ->
[Val|filtermap(F, Tail)];
false ->
filtermap(F, Tail)
end;
filtermap(F, []) when is_function(F, 1) -> [].
连续用函数 Fun(Elem) 调用列表 List1 里的元素 Elem。函数 Fun 必须返回一个布尔值或一个 {true, Value} 的元组。该函数返回的列表里的元素就是函数 Fun 调用后返回的新值,即被符合函数 Fun 调用返回 true 或 {true,Elem} 的值。
Fun = fun(X) ->
case X rem 2 of
0 ->
{true, X div 2};
_ ->
false
end
end,
lists:filtermap(Fun, [1,2,3,4,5]).
该函数可以这样定义:
filtermap(Fun, List1) ->
lists:foldr(fun(Elem, Acc) ->
case Fun(Elem) of
false -> Acc;
true -> [Elem|Acc];
{true,Value} -> [Value|Acc]
end,
end, [], List1).