在Scala中迭代Java集合 [英] Iterating over Java collections in Scala
问题描述
我正在撰写一些使用 Apache POI API的Scala代码。我想迭代包含在 java.util.Iterator
中的行,我从Sheet类中获取。我想在中为每个
样式循环使用迭代器,所以我一直试图将其转换为原生Scala集合,但不会运气。
I'm writing some Scala code which uses the Apache POI API. I would like to iterate over the rows contained in the java.util.Iterator
that I get from the Sheet class. I would like to use the iterator in a for each
style loop, so I have been trying to convert it to a native Scala collection but will no luck.
我看过Scala包装类/ traits,但我看不出如何正确使用它们。如何在Scala中迭代Java集合而不使用详细的 while(hasNext())getNext()
循环风格?
I have looked at the Scala wrapper classes/traits, but I can not see how to use them correctly. How do I iterate over a Java collection in Scala without using the verbose while(hasNext()) getNext()
style of loop?
这是我基于正确答案写的代码:
Here's the code I wrote based on the correct answer:
class IteratorWrapper[A](iter:java.util.Iterator[A])
{
def foreach(f: A => Unit): Unit = {
while(iter.hasNext){
f(iter.next)
}
}
}
object SpreadsheetParser extends Application
{
implicit def iteratorToWrapper[T](iter:java.util.Iterator[T]):IteratorWrapper[T] = new IteratorWrapper[T](iter)
override def main(args:Array[String]):Unit =
{
val ios = new FileInputStream("assets/data.xls")
val workbook = new HSSFWorkbook(ios)
var sheet = workbook.getSheetAt(0)
var rows = sheet.rowIterator()
for (val row <- rows){
println(row)
}
}
}
推荐答案
有一个包装类( scala.collection.jcl.MutableIterator .Wrapper
)。所以如果你定义
There is a wrapper class (scala.collection.jcl.MutableIterator.Wrapper
). So if you define
implicit def javaIteratorToScalaIterator[A](it : java.util.Iterator[A]) = new Wrapper(it)
那么它将作为Scala迭代器的子类,所以你可以做 foreach
。
then it will act as a sub class of the Scala iterator so you can do foreach
.
这篇关于在Scala中迭代Java集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!