> Erlang中文手册 > filtermap/2 过滤并映射操作符合函数条件的元素

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).