Scala 是否提供内置类、实用程序、语法或其他机制来转换(通过包装)带有 Iterable 的 Iterator?
例如,我有一个 Iterator[Foo],我需要一个 Iterable[Foo],所以目前我是:
val foo1: Iterator[Foo] = ....
val foo2: Iterable[Foo] = new Iterable[Foo] {
def elements = foo1
}
这看起来很丑陋和不必要。有什么更好的方法?
Scala 是否提供内置类、实用程序、语法或其他机制来转换(通过包装)带有 Iterable 的 Iterator?
例如,我有一个 Iterator[Foo],我需要一个 Iterable[Foo],所以目前我是:
val foo1: Iterator[Foo] = ....
val foo2: Iterable[Foo] = new Iterable[Foo] {
def elements = foo1
}
这看起来很丑陋和不必要。有什么更好的方法?
Iterator
在 Scala 2.8.0 中有一个toIterable
方法,但在 2.7.7 或更早版本中没有。它不是隐式的,但如果需要,您可以定义自己的隐式转换。
您应该非常小心将an隐式转换Iterator
为 an Iterable
(我通常使用Iterator.toList
- 显式)。这样做的原因是,通过将结果传递给需要 的方法(或函数)Iterable
,您会失去对它的控制,以至于您的程序可能会被破坏。这是一个例子:
def printTwice(itr : Iterable[String]) : Unit = {
itr.foreach(println(_))
itr.foreach(println(_))
}
如果 anIterator
可以以某种方式隐式转换为 an Iterable
,下面会打印什么?
printTwice(Iterator.single("Hello"))
它(当然)只会打印一次Hello。最近,trait
TraversableOnce
已将. 在我看来,这可以说是一个错误。Iterator
Iterable
我个人的偏好是Iterator
尽可能显式使用,然后使用List
,Set
或IndexedSeq
直接使用。我发现我很少能编写一个真正不知道它传递的类型的方法。一个例子:
def foo(trades: Iterable[Trade]) {
log.info("Processing %d trades", trades.toList.length) //hmmm, converted to a List
val shorts = trades.filter(_.side.isSellShort)
log.info("Found %d sell-short", shorts.toList.length) //hmmm, converted to a List again
//etc