Lan*_*uhn 12 scala scala-collections
Scala是否提供内置的类,实用程序,语法或其他机制来转换(通过换行)具有Iterable的Iterator?
例如,我有一个迭代器[Foo],我需要一个Iterable [Foo],所以目前我是:
val foo1: Iterator[Foo] = ....
val foo2: Iterable[Foo] = new Iterable[Foo] {
def elements = foo1
}
Run Code Online (Sandbox Code Playgroud)
这看起来很丑陋而且没必要.什么是更好的方式?
你应该非常小心约不断隐含转换的Iterator成Iterable(我通常使用Iterator.toList -明确).这样做的原因是,通过将结果传递给期望a的方法(或函数)Iterable,您将失去对程序可能被破坏的控制.这是一个例子:
def printTwice(itr : Iterable[String]) : Unit = {
itr.foreach(println(_))
itr.foreach(println(_))
}
Run Code Online (Sandbox Code Playgroud)
如果一个Iterator人以某种方式隐含地转换为一个Iterable,那么下面会打印什么?
printTwice(Iterator.single("Hello"))
Run Code Online (Sandbox Code Playgroud)
它(当然)只打印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
Run Code Online (Sandbox Code Playgroud)