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