pipe - 结合 Enum.map 和 Enum.each
问题描述
我是 Elixir 的新手,我正在学习和阅读有关列表/枚举使用和函数管道的内容。
我学会了如何组合Enum.map
和Enum.each
,例如操作列表的内容并将结果列表打印到控制台
people = ["Qui", "Quo", "Qua"]
people
|> Enum.map(&String.upcase/1)
|> Enum.map(&Hello.hello/1)
|> Enum.each(&IO.puts/1)
我想知道它是否存在一个结合在一起的库函数Enum.map
:Enum.each
我的想法是为 list 的每个元素做一些事情并返回未触及的 list,以便进行管道函数调用。当然,我可以为传递给的函数添加副作用Enum.map
,但我不太喜欢这种方法,我希望将副作用与函数转换明确分开。
我阅读Enum
和List
文档,但我不知道如何做到这一点: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)
我工作(对我来说,编写这段代码在教学上非常有用),但我想知道
- 如果标准库中有内置的东西
- 如果我的手工解决方案在 Elixir 中是一个很好且惯用的解决方案
提前致谢!
解决方案
Stream.each会做你想做的事,但你需要使用流来触发效果。
为每个项目执行给定的函数。
用于向流添加副作用(如打印)。
people
|> Enum.map(&String.upcase/1)
|> Stream.each(&IO.inspect/1)
|> Enum.to_list
推荐阅读
- assembly - 查找 ss:[esp+28] 引用的地址
- python - 查找列表中大于其邻居的元素数量
- visual-studio - 在选项对话框中导航页面(Visual Studio 扩展)
- twilio - Twilio Studio & Functions - 呼叫耳语
- python - Python 从不同版本导入不同的库
- sql - 从 JSON 中提取负整数
- alfresco - 在 Activiti 7 中使用接收任务暂停和恢复
- vim-plugin - 如何在插入模式下打开 ctrlp 插件文件建议?
- redux - ngrx(redux 模式)中的一些东西,我仍然无法用于大型应用程序
- rest - 尝试根据 where 子句删除列表中的所有记录