当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Elixir Enum.max_by用法及代码示例


Elixir语言中 Enum.max_by 相关用法介绍如下。

用法:

max_by(enumerable, fun, sorter \\ &>=/2, empty_fallback \\ fn -> raise Enum.EmptyError end)
@spec max_by(
  t(),
  (element() -> any()),
  (element(), element() -> boolean()) | module(),
  (() -> empty_result)
) :: element() | empty_result
when empty_result: any()

返回由给定 fun 计算的 enumerable 中的最大元素。

默认情况下,比较是使用>= 排序器函数完成的。如果多个元素被认为是最大的,则返回找到的第一个。如果您希望返回被认为是最大的最后一个元素,则排序器函数不应为相等的元素返回 true。

如果enumerable 为空,则调用提供的empty_fallback 函数并返回其值。默认的 empty_fallback 引发 Enum.EmptyError

例子

iex> Enum.max_by(["a", "aa", "aaa"], fn x -> String.length(x) end)
"aaa"

iex> Enum.max_by(["a", "aa", "aaa", "b", "bbb"], &String.length/1)
"aaa"

这个函数使用 Erlang 的术语排序这一事实意味着比较是结构化的而不是语义的。因此,如果要比较结构体,大多数结构体都提供了"compare"函数,例如 Date.compare/2 ,它接收两个结构体并返回:lt(小于)、:eq(等于)和:gt (比...更棒)。如果你传递一个模块作为排序函数,Elixir 会自动使用该模块的compare/2 函数:

iex> users = [
...>   %{name: "Ellis", birthday: ~D[1943-05-11]},
...>   %{name: "Lovelace", birthday: ~D[1815-12-10]},
...>   %{name: "Turing", birthday: ~D[1912-06-23]}
...> ]
iex> Enum.max_by(users, &(&1.birthday), Date)
%{name: "Ellis", birthday: ~D[1943-05-11]}

最后,如果您不想引发空枚举,则可以传递空回退:

iex> Enum.max_by([], &String.length/1, fn -> nil end)
nil

相关用法


注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Enum.max_by(enumerable, fun, sorter \\ &>=/2, empty_fallback \\ fn -> raise Enum.EmptyError end)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。