结合Enum.map和Enum.each

时间:2019-03-01 16:38:17

标签: pipe elixir

我是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组合在一起的库函数:我的想法是为列表的每个元素 AND 做一些事情未修改的列表,以便继续进行管道函数调用。 当然,我可以在传递给Enum.map的函数中添加副作用,但是我不太喜欢这种方法,我希望将副作用与 functional 转换明确分开。

我阅读了EnumList文档,但我不知道该怎么做:Enum.each返回:ok,但找不到返回初始值的类似内容列表。

所以我自己实现了如下:

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

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

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中很好的惯用解决方案

谢谢!

1 个答案:

答案 0 :(得分:2)

Stream.each会做您想要的,但是您需要消耗流以触发效果。

  

为每个项目执行给定的功能。

     

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

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