我有很多数据,我使用Stream.map/2
来获得结果。使用这个函数后,我得到了这个结果
#Stream<[
enum: #Function<51.58486609/2 in Stream.resource/3>,
funs: [#Function<47.58486609/1 in Stream.map/2>]
]>
现在,如果我映射结果并返回值,那么它将返回每个值两次。
如果我使用Enum.map
而不是Stream.map
我得到的结果。既然我不能在这里使用Enum
函数,我该怎么办?
结果将是map
的列表简单的答案是肯定的正如这里所说:https://elixir-lang.org/getting-started/enumerables-and-streams.html流
流不生成中间链表,而是构建一系列的仅在传递底层流时调用的计算到Enum模块。流在处理大型、可能是无限的,集合
如果您熟悉任何响应式编程系统,如RxJS, RxJava或Apple的Combine框架,那么使用Elixir的Stream
函数就像在Publisher上使用操作符一样。您正在声明式地定义一个处理管道,但是该管道在订阅者要求它开始发送值之前不会做任何事情。
在响应式编程中,Subscriber
请求Publisher
开始发送值。具体细节将具体到每个框架,但通常有一个sink
函数,允许您指定闭包来接收值,或Subscriber
的其他机制来…嗯…订阅Publisher
.
在Elixir中,根据我的经验,您在管道的尾部使用Enum
中的一个(或多个)函数来扮演"订阅者"的角色。在这个场景中。从流中提取数据。
如果你不熟悉响应式编程,前面的解释听起来像是胡言乱语。请不要太担心。(虽然Rx是有趣的东西,在我看来值得一玩)