Scala是否提供内置的类,实用程序,语法或其他机制来转换(通过换行)具有Iterable的Iterator?
例如,我有一个Iterator [Foo],我需要一个Iterable [Foo],所以目前我是:
val foo1: Iterator[Foo] = ....
val foo2: Iterable[Foo] = new Iterable[Foo] {
def elements = foo1
}
这看起来很丑陋而且没必要。什么是更好的方式?
答案 0 :(得分:13)
Iterator
在Scala 2.8.0中有toIterable
方法,但在2.7.7或更早版本中没有。它不是隐含的,但如果需要,可以定义自己的隐式转换。
答案 1 :(得分:7)
你应非常小心关于曾暗中将Iterator
转换为Iterable
(我通常使用Iterator.toList
- 明确地)。这样做的原因是,通过将结果传递给期望Iterable
的方法(或函数),您将失去对程序可能被破坏的控制。这是一个例子:
def printTwice(itr : Iterable[String]) : Unit = {
itr.foreach(println(_))
itr.foreach(println(_))
}
如果Iterator
以某种方式隐式转换为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