2017-03-07 22 views
0

如果我有两个迭代器,我只需要编写iter1 ++ iter2并且只有在需要时才会计算迭代器。有没有办法以相同的方式链接Iterable实例?如何在不计算底层迭代器的情况下链接Iterable

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

+2

我实际上认为这就是迭代器的目的:D所以我会使用iterable1.iterator ++ iterable2.iterator来避免计算。 – C4stor

+0

好吧,那就是备份计划 – ayvango

+0

如果你已经有'Iterable',那么你已经计算出了你的嵌套值。这不是导致计算的链接。 –

回答

0

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(...) 
+0

所以,我应该基本上使用'iterable.view'来获得所需的行为? – ayvango

+0

@ayvango是的,我认为是。或'iterable.iterator'。文档说,“迭代集合的所有视图都是通过重新解释迭代器方法来定义的”。 –

相关问题