在Scala中迭代Java集合

问题

我正在编写一些使用Apache POIAPI的Scala代码。我想迭代我从Sheet类得到的java.util.Iterator中包含的行。我想在afor eachstyle循环中使用迭代器,所以我一直在尝试将它转换为原生的Scala集合,但是没有运气。

我查看了Scala包装器类/特性,但我看不出如何正确使用它们。如何在不使用verbosewhile(hasNext()) getNext()style循环的情况下在Scala中迭代Java集合?

这是我根据正确答案编写的代码:

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)
        }
    }
}

#1 热门回答(242 赞)

从Scala 2.8开始,你所要做的就是导入JavaConversions对象,该对象已经声明了适当的转换。

import scala.collection.JavaConversions._

但这在以前的版本中不起作用。


#2 热门回答(25 赞)

有一个包装类(scala.collection.jcl.MutableIterator.Wrapper)。所以,如果你定义

implicit def javaIteratorToScalaIterator[A](it : java.util.Iterator[A]) = new Wrapper(it)

那么它将充当Scala迭代器的子类,因此你可以做到foreach


#3 热门回答(15 赞)

这里的正确答案是定义从Java'sIterator到某些自定义类型的隐式转换。此类型应实现委托给底层Iterator的aforeach方法。这将允许你将Scalafor循环与任何JavaIterator一起使用。