usted debe ser muy cuidadoso sobre siempre implícitamente convertir una Iterator
en un Iterable
(normalmente uso Iterator.toList
- explícitamente). La razón para esto es que, al pasar el resultado a un método (o función) que espera un Iterable
, pierde el control en la medida en que su programa podría estar roto. He aquí un ejemplo:
def printTwice(itr : Iterable[String]) : Unit = {
itr.foreach(println(_))
itr.foreach(println(_))
}
Si un Iterator
eran de alguna manera convertir implícitamente en un Iterable
, lo que será la siguiente imprimiría?
printTwice(Iterator.single("Hello"))
Será (por supuesto), sólo imprimir Hola vez. Muy recientemente, se ha agregado trait
TraversableOnce
a la biblioteca de colecciones, que unifica Iterator
y Iterable
. En mi opinión, esto es posiblemente un error.
Mi preferencia personal es usar Iterator
explícita siempre que sea posible y luego usar List
, Set
o IndexedSeq
directamente. He descubierto que rara vez puedo escribir un método que sea genuinamente agnóstico del tipo que se transmite. Un ejemplo:
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
duplicar http://stackoverflow.com/questions/1072784/how-can-i-convert-a-java-iterable-to-a-scala-iterable – wheaties
@wheaties esto no es una duplicado de esa pregunta. –