Elixir:如何在含非数字字符串的列表中统计奇数整数?
解决ListFilter处理非数字字符串报错的问题
原代码的问题在于String.to_integer/1遇到非数字字符串时会抛出异常,直接导致函数崩溃。我们需要先筛选出可以成功转换为整数的字符串,再统计其中奇数的数量。
修改后的代码(简洁版)
defmodule ListFilter do def call(list) do { :ok, list |> Enum.flat_map(fn str -> case String.to_integer(str) do {:ok, int} -> [int] :error -> [] end end) |> Enum.filter(&(rem(&1, 2) == 1)) |> Enum.count() } end def call() do {:error, "Its wrong!"} end end
代码说明
- 使用
Enum.flat_map遍历列表:- 对每个字符串尝试转换为整数,成功则返回包含该整数的列表,失败则返回空列表
- 自动过滤掉无法转换的非数字字符串
- 后续流程和原代码一致:过滤奇数、统计数量
测试验证
- 执行
ListFilter.call(["1", "3", "6", "43","6"]),返回{:ok, 3},符合预期 - 执行
ListFilter.call(["1", "2", "3", "43", "abc", "banana", "6"]),返回{:ok, 3},不再报错
内容的提问来源于stack exchange,提问作者Fabio Alencar
相关产品推荐
相关产品推荐

