Scala ZIO Stream -- 将 Stream[A] 转换为 Stream[B],其中一个 A 产生零个或多个 B

Scala ZIO Stream -- Convert Stream[A] to Stream[B] where one A produces zero or more B

我有一个 Stream[A] 和一个函数 zeroOrMoreB(value: A): Seq[B],它给出了一个 A returns 零个或多个 B。从这两部分,我如何构建一个 Stream[B]?

我可以得到一个 Stream[Stream[B]](见下文),但我不知道如何把它弄平。

stream <- ZStream
  .fromIterable(vectorOfAs)
  .map(zeroOrMoreB)

正如我常说的,Scaladoc 是你的朋友。

您可以使用mapConcat

val stream = ZStream.fromIterable(vectorOfAs).mapConcat(zeroOrMoreB)

现在如果 zeroOrMoreB 实际上 returns 一个 ZStream 而不是 Seq,你只需使用 flatMap

val stream = ZStream.fromIterable(vectorOfAs).flatMap(zeroOrMoreB)

最后,如果您喜欢 for 语法,您可以这样做

val stream = for {
  a <- ZStream.fromIterable(vectorOfAs)
  b <- ZStream.fromIterable(zeroOrMoreB(a))
} yield b

我显然没有想清楚 -- .flatMap 成功了。

stream <- ZStream
  .fromIterable(vectorOfAs)
  .flatMap(a => zeroOrMoreB(a))