【发布时间】:2017-12-15 04:13:14
【问题描述】:
我最近在我的代码中遇到了一个错误,其中迭代多个流会导致它们仅迭代第一项。我将我的流转换为缓冲区(我什至不知道我正在调用的函数的实现返回一个流)并且问题得到了解决。我觉得这很难相信,所以我创建了一个最低限度的可验证示例:
def f(as: Seq[String], bs: Seq[String]): Unit =
for {
a <- as
b <- bs
} yield println((a, b))
val seq = Seq(1, 2, 3).map(_.toString)
f(seq, seq)
println()
val stream = Stream.iterate(1)(_ + 1).map(_.toString).take(3)
f(stream, stream)
打印其输入的每个组合的函数,并使用 Seq [1, 2, 3] 和 Stream [1, 2, 3] 调用。
带有seq的结果是:
(1,1)
(1,2)
(1,3)
(2,1)
(2,2)
(2,3)
(3,1)
(3,2)
(3,3)
流的结果是:
(1,1)
我只能在迭代多个生成器时复制它,迭代单个流似乎工作正常。
所以我的问题是:为什么会发生这种情况,我该如何避免这种故障?也就是说,在每次多生成器迭代之前都没有使用.toBuffer 或.to[Vector]?
谢谢。
【问题讨论】: