Erlang中文手册(Erldoc.com)  »  lists  »  filtermap/2
Erlang并发编程 Erlang/OTP设计原理 Erlang/OTP[pdf] Mnesia用户手册[pdf] Erlang完整手册[en] 官网手册[en] 模块列表 方法列表 随机 Erlang中文社区(BBS) 美女图库

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).
阿里云 - 最高1000元通用代金券立即可用
沪ICP备13037221号-9