Elixir 后处理枚举到列表
我有这个管道Elixir 后处理枚举到列表,elixir,Elixir,我有这个管道 events |> Task.async_stream(&expensive_func/1) |> Enum.to_list 将返回以下数据: [ok: {item}, ok: {item} ... ] 因此,为了得到一个项目数组,[item,item]我对它进行了如下后处理: events |> Task.async_stream(&expensive_func/1) |> Enum.to_list |> Enum.
events
|> Task.async_stream(&expensive_func/1)
|> Enum.to_list
将返回以下数据:
[ok: {item}, ok: {item} ... ]
因此,为了得到一个项目数组,[item,item]
我对它进行了如下后处理:
events
|> Task.async_stream(&expensive_func/1)
|> Enum.to_list
|> Enum.map(fn {:ok, event} -> event end)
有没有更优雅的方法可以做到这一点?另一种方法:
events
|> Task.async_stream(&expensive_func/1))
|> Enum.map(&(elem(&1,1)))
警告:由于我们直接访问每个
任务
返回的元组的第二个元素,因此不进行任何检查以确保任务已正确运行。您可以在:ok
上添加模式匹配来修复该问题(如您在问题中所做的)。这里要考虑的主要问题是:任务可能会失败。如果期望的行为是丢弃它们,只需直接使用示例中的示例并明确丢弃它们:
事件
|>Task.async\u流(&U func/1)
|>枚举减少([],fn
{:好的,事件},acc->[事件| acc]
_,acc->acc#放弃故障
(完)
|>Enum.reverse()
另一种选择是依赖任务的返回值(如果失败时返回例如nil
),则可以直接使用:
事件
|>Task.async\u流(&U func/1)
|>枚举到_列表()
|>关键字.values()
FWIW,如果由于函数未处理
:error而导致至少一个任务失败,则原始解决方案将引发MatchError
。一个问题,为什么需要反向操作?Enum.reduce也在反转它?将项目预先添加到链表[event | acc]
比添加acc++[event]
要快得多,这就是为什么上面的代码一直在预先添加它们,这会反转原始输入(LIFO)。mm我认为reduce可能会减慢它的速度,我收到:*(退出)退出时间:Task.Supervised.stream(5000)**(EXIT)time out我从未经历过这种情况,Enum.reduce/3
极不可能会减慢速度。如果<代码>枚举。toyList](/Cult>在中间)在您的特定情况下执行这个技巧,只是在 EnUM之前嵌入它。仅供参考。@Botonomous这是因为它在上的模式不匹配:ok
,或者我遗漏了什么?不,这是因为你隐藏了元素(0)。ok@Botonomous,我想我选择了一个错误的措辞。谢谢你的反馈,我已经编辑了答案来纠正这一点。