首页 > 解决方案 > 结合 Enum.map 和 Enum.each

问题描述

我是 Elixir 的新手,我正在学习和阅读有关列表/枚举使用和函数管道的内容。

我学会了如何组合Enum.mapEnum.each,例如操作列表的内容并将结果列表打印到控制台

people = ["Qui", "Quo", "Qua"]
people
    |> Enum.map(&String.upcase/1)
    |> Enum.map(&Hello.hello/1)
    |> Enum.each(&IO.puts/1)

我想知道它是否存在一个结合在一起的库函数Enum.mapEnum.each我的想法是为 list 的每个元素做一些事情并返回未触及的 list,以便进行管道函数调用。当然,我可以为传递给的函数添加副作用Enum.map,但我不太喜欢这种方法,我希望将副作用与函数转换明确分开。

我阅读EnumList 文档,但我不知道如何做到这一点:Enum.each返回:ok并且我找不到类似的返回初始列表的内容。

所以我自己实现如下:

defmodule MyEnum do 
    def tee list, action do
        Enum.map(list, fn item -> 
            action.(item)
            item
        end)
    end
end

免责声明:当然,我添加了副作用map,但我将这种肮脏性隔离到一个函数中,其名称应该阐明我的意图)并将前面的示例重写为

people = ["Qui", "Quo", "Qua"]
people
    |> Enum.map(&String.upcase/1)
    |> Enum.map(&Hello.hello/1)
    |> MyEnum.tee(&IO.puts/1)
    |> Enum.map(&String.upcase/1)
    |> Enum.each(&IO.puts/1)

我工作(对我来说,编写这段代码在教学上非常有用),但我想知道

  1. 如果标准库中有内置的东西
  2. 如果我的手工解决方案在 Elixir 中是一个很好且惯用的解决方案

提前致谢!

标签: pipeelixir

解决方案


Stream.each会做你想做的事,但你需要使用流来触发效果。

为每个项目执行给定的函数。

用于向流添加副作用(如打印)。

people 
|> Enum.map(&String.upcase/1) 
|> Stream.each(&IO.inspect/1) 
|> Enum.to_list

推荐阅读