用完Stream还需要用Enum吗?

Do I need to use Enum after I have used Stream?

我有很多数据,我正在使用 Stream.map/2 来获取结果。所以在使用这个函数后我得到了这个结果

  #Stream<[
  enum: #Function<51.58486609/2 in Stream.resource/3>,
  funs: [#Function<47.58486609/1 in Stream.map/2>]
  ]>

现在,如果我映射结果和 return 值,那么它将 return 每个值两次。

如果我使用 Enum.map 而不是 Stream.map,我会得到结果。既然我不能在这里使用 Enum 功能,我该怎么办?

结果将是一个地图列表

简单的答案是肯定的 正如它在这里所说: https://elixir-lang.org/getting-started/enumerables-and-streams.html#streams

Instead of generating intermediate lists, streams build a series of computations that are invoked only when we pass the underlying stream to the Enum module. Streams are useful when working with large, possibly infinite, collections.

如果您熟悉任何反应式编程系统,如 RxJS、RxJava 或 Apple 的 Combine 框架,使用 Elixir 的 Stream 函数就像在 Publisher 上使用运算符一样。您以声明方式定义了一个处理管道,但在订阅者要求它开始发出值之前,该管道不会执行任何操作。

在响应式编程中,Subscriber 要求 Publisher 开始发射值。细节将特定于每个框架,但通常有一个 sink 函数可以让您指定一个闭包来接收值,或者 Subscriber 的一些其他机制......好吧......订阅Publisher.

在 Elixir 中,根据我的经验,您在管道的尾端使用 Enum 中的一个(或多个)函数来扮演这种情况下的“订阅者”角色。通过流提取数据。

如果您不熟悉响应式编程并且前面的解释听起来像胡言乱语。请不要担心太多。 (虽然 Rx 是有趣的东西,在我看来值得一试)