如何在map函数中检索特定值?

时间:2016-10-30 21:25:26

标签: erlang

我有这个功能:

Headers = "hellohellohello".
lists:map(fun(X) -> isExists(X,Headers) end, ["h","he","hell","hello",...]).

结果是一个布尔列表,让我们说:

[false,false,false,true,...] 

请注意,结果中包含一个“true” 我想得到的价值:

  

  

“你好”

在我们的案例中。

1 个答案:

答案 0 :(得分:4)

您可以使用lists:filter/2获取isExists/2返回true的结果列表:

1> Headers = "hellohellohello".
"hellohellohello"
2> lists:filter(fun(X) -> isExists(X,Headers) end, ["h","he","hell","hello"]).
["hello"]

但是返回一个列表,而不是一个值。或者,您可以使用lists:map/2将列表中的每个值与将其传递给isExists/2的结果配对,然后使用lists:keyfind/3提取结果:

4> lists:keyfind(true, 1, lists:map(fun(X) -> {isExists(X,Headers), X} end, ["h","he","hell","hello"])).
{true,"hello"}

但是这个替代方案需要多个列表遍历,并且它返回一个元组,您必须从中提取值。

也许最好的选择是使用lists:foldl/3

3> lists:foldl(fun(X,Acc) -> case isExists(X,Headers) of true -> X; false -> Acc end end, false, ["h","he","hell","hello"]).
"hello"

如果没有匹配的结果,则会返回累加器的初始值,在此示例中为false