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))
我有一个 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))