在 Scala 中迭代 Java 集合

我正在编写一些使用Apache POI API的Scala代码。我想循环访问从 Sheet 类获取的 中包含的行。我想在样式循环中使用迭代器,所以我一直在尝试将其转换为本机Scala集合,但不会有任何运气。java.util.Iteratorfor each

我已经看过Scala包装类/特征,但我看不到如何正确使用它们。如何在不使用详细循环样式的情况下迭代 Scala 中的 Java 集合?while(hasNext()) getNext()

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

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

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

import scala.collection.JavaConversions._

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


答案 2

编辑:Scala 2.13.0弃用,所以从2.13.0开始你需要使用。scala.collection.JavaConvertersscala.jdk.CollectionConverters

Scala 2.12.0 弃用 ,所以从 2.12.0 开始,一种方法是这样的:scala.collection.JavaConversions

import scala.collection.JavaConverters._

// ...

for(k <- javaCollection.asScala) {
    // ...
}

(注意导入,新的是JavaConverters,不推荐使用的是JavaConversions)