Elixir 语言 列表分组筛选过滤示例

Elixir阿木 发布于 2025-06-19 16 次阅读


摘要:

Elixir 是一种用于构建可扩展和可靠应用程序的函数式编程语言,它运行在 Erlang 虚拟机上。在 Elixir 中,列表是处理数据的基本结构之一。本文将深入探讨 Elixir 语言中如何对列表进行分组、筛选和过滤,通过一系列示例代码,帮助读者掌握这些常用的列表操作技术。

一、

在 Elixir 中,列表是一个非常重要的数据结构,它允许我们以有序的方式存储一系列元素。在实际应用中,我们经常需要对列表进行分组、筛选和过滤等操作,以便提取出我们感兴趣的数据。本文将详细介绍这些操作的方法和技巧。

二、列表分组

列表分组是将列表中的元素按照一定的规则进行分类的过程。在 Elixir 中,我们可以使用 `Enum.group_by/3` 函数来实现列表分组。

elixir

defmodule ListGroupingExample do


def group_by_age(people) do


Enum.group_by(people, &(&1.age))


end


end

people = [


%{:name => "Alice", :age => 25},


%{:name => "Bob", :age => 30},


%{:name => "Charlie", :age => 25},


%{:name => "David", :age => 35}


]

grouped_by_age = ListGroupingExample.group_by_age(people)


IO.inspect(grouped_by_age)


在上面的代码中,我们定义了一个名为 `ListGroupingExample` 的模块,其中包含一个名为 `group_by_age/1` 的函数。这个函数接收一个包含人员信息的列表,并使用 `Enum.group_by/3` 函数按照年龄对人员进行分组。

三、列表筛选

列表筛选是从列表中选出满足特定条件的元素。在 Elixir 中,我们可以使用 `Enum.filter/2` 函数来实现列表筛选。

elixir

defmodule ListFilteringExample do


def filter_by_age(people, max_age) do


Enum.filter(people, &(&1.age < max_age))


end


end

grouped_by_age = ListGroupingExample.group_by_age(people)


filtered_by_age = ListFilteringExample.filter_by_age(grouped_by_age, 30)

IO.inspect(filtered_by_age)


在上面的代码中,我们定义了一个名为 `ListFilteringExample` 的模块,其中包含一个名为 `filter_by_age/2` 的函数。这个函数接收一个分组后的列表和一个最大年龄值,然后使用 `Enum.filter/2` 函数筛选出年龄小于最大年龄值的人员。

四、列表过滤

列表过滤与筛选类似,但通常用于移除列表中的特定元素。在 Elixir 中,我们可以使用 `Enum.reject/2` 函数来实现列表过滤。

elixir

defmodule ListFilteringExample do


def reject_by_age(people, max_age) do


Enum.reject(people, &(&1.age >= max_age))


end


end

filtered_by_age = ListFilteringExample.reject_by_age(grouped_by_age, 30)

IO.inspect(filtered_by_age)


在上面的代码中,我们定义了一个名为 `ListFilteringExample` 的模块,其中包含一个名为 `reject_by_age/2` 的函数。这个函数接收一个分组后的列表和一个最大年龄值,然后使用 `Enum.reject/2` 函数移除年龄大于等于最大年龄值的人员。

五、列表映射

在处理列表时,我们经常需要将列表中的每个元素转换成另一种形式。在 Elixir 中,我们可以使用 `Enum.map/2` 函数来实现列表映射。

elixir

defmodule ListMappingExample do


def map_to_names(people) do


Enum.map(people, &(&1.name))


end


end

names = ListMappingExample.map_to_names(grouped_by_age)


IO.inspect(names)


在上面的代码中,我们定义了一个名为 `ListMappingExample` 的模块,其中包含一个名为 `map_to_names/1` 的函数。这个函数接收一个分组后的列表,并使用 `Enum.map/2` 函数将列表中的每个元素映射为其姓名。

六、总结

本文通过一系列示例代码,详细介绍了 Elixir 语言中列表分组、筛选、过滤和映射的基本操作。掌握这些技术对于编写高效、可读的 Elixir 代码至关重要。在实际应用中,我们可以根据具体需求灵活运用这些技术,以实现复杂的数据处理任务。

通过本文的学习,读者应该能够:

- 使用 `Enum.group_by/3` 函数对列表进行分组。

- 使用 `Enum.filter/2` 和 `Enum.reject/2` 函数对列表进行筛选和过滤。

- 使用 `Enum.map/2` 函数对列表进行映射。

希望本文能够帮助读者更好地理解和应用 Elixir 中的列表操作技术。