拥有此代码:
iex(2)> TestQuery.build_query()
["test1", "test2", nil]
如果我运行它,我将以此列表结束:
nil
如何避免添加false
?或者对nil
条款什么都不做?
此示例是一个简单的示例,该方法使查询和查询可能返回nil
(404),我想构建一个包含成功查询的列表,而不包含Either
项。
答案 0 :(得分:4)
我能想到的三种方式:
使用Enum.filter/2
并从true
返回false
/ query
:
def build_query() do
Enum.filter(["test1", "test2", "hello"], fn item ->
query(item)
end)
end
def query(item) do
String.contains? item, "test"
end
如果您的实际query
函数想要返回的值不是item
,则无效。
删除结尾处的所有nil
值:
Enum.map(["test1", "test2", "hello"], fn item ->
query(item)
end) |> Enum.reject(&is_nil/1)
如果item
为nil
,这将无法使用,因为它也会被移除。
使用Enum.flat_map
并返回一个空列表而不是nil
,如果不是nil,则返回一个非空列表:
def build_query() do
Enum.flat_map(["test1", "test2", "hello"], fn item ->
query(item)
end)
end
def query(item) do
case String.contains? item, "test" do
true -> [item]
false -> []
end
end
答案 1 :(得分:2)
Enum.filter/2
仅返回第二个arg返回truthy值的元素。在Elixir,除了nil和false之外,一切都是真实的。所以,你可以用这种方式使用你的查询函数(不需要添加匿名函数):
Enum.filter(["test1", "test2", "hello"], &query/1)
或者对于那个特定的例子:
Enum.filter(["test1", "test2", "hello"], &String.contains?(&1, "test"))
或者你甚至可以使用理解并将成功的查询映射到另一个列表中:
for item <- ["test1", "test2", "hello"], String.contains?(item, "test"),
do: on_successful(item)