如何在不计算底层迭代器的情况下链接Iterable

时间:2017-03-07 14:02:45

标签: scala collections scala-collections

如果我有两个迭代器,我可以写iter1 ++ iter2并且在需要之前不会计算迭代器。有没有办法以同样的方式链接Iterable实例?

我尝试使用iterable1 ++ iterable2,但它会立即计算嵌套值,就像它们被添加到某个结构中一样。是否可以避免这种额外的计算并创建额外的数据结构?

2 个答案:

答案 0 :(得分:1)

没有。 Iterable只是一个可以通过迭代的任何东西实现的接口。所以当你有一个Iterable[Int]可以是一个懒惰或严格的集合时,没有办法知道。

scala> val iterable1: Iterable[Int] = List(1,2,3)
iterable1: Iterable[Int] = List(1, 2, 3)

scala> iterable1 ++ iterable1
res2: Iterable[Int] = List(1, 2, 3, 1, 2, 3)

scala> val iterable2: Iterable[Int] = List(1,2,3).view
iterable2: Iterable[Int] = SeqView(...)

scala> iterable2 ++ iterable2
res3: Iterable[Int] = SeqViewA(...)

答案 1 :(得分:0)

您可以编写一个简单的链迭代,它是Iterable的延迟连接:

case class Chain[A](iter: Iterable[A]*) extends Iterable[A]{
  def iterator: Iterator[A] = iter.map(_.iterator).foldLeft(Iterator.empty: Iterator[A])(_++_)
}

Chain(List(1,2,3), 10 to 15, Vector(42,13))