如果我有两个迭代器,我只需要编写iter1 ++ iter2
并且只有在需要时才会计算迭代器。有没有办法以相同的方式链接Iterable
实例?如何在不计算底层迭代器的情况下链接Iterable
我试图使用iterable1 ++ iterable2
,但它会立即计算嵌套值,就像它们被添加到某个结构中一样。是否有可能避免这种额外的计算和创建额外的数据结构?
如果我有两个迭代器,我只需要编写iter1 ++ iter2
并且只有在需要时才会计算迭代器。有没有办法以相同的方式链接Iterable
实例?如何在不计算底层迭代器的情况下链接Iterable
我试图使用iterable1 ++ iterable2
,但它会立即计算嵌套值,就像它们被添加到某个结构中一样。是否有可能避免这种额外的计算和创建额外的数据结构?
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(...)
所以,我应该基本上使用'iterable.view'来获得所需的行为? – ayvango
@ayvango是的,我认为是。或'iterable.iterator'。文档说,“迭代集合的所有视图都是通过重新解释迭代器方法来定义的”。 –
我实际上认为这就是迭代器的目的:D所以我会使用iterable1.iterator ++ iterable2.iterator来避免计算。 – C4stor
好吧,那就是备份计划 – ayvango
如果你已经有'Iterable',那么你已经计算出了你的嵌套值。这不是导致计算的链接。 –