我正在编写一些使用Apache POI API的Scala代码.我想迭代java.util.Iterator
我从Sheet类中获得的行.我想在for each
样式循环中使用迭代器,所以我一直在尝试将其转换为原生的Scala集合,但没有运气.
我查看了Scala包装器类/特性,但我看不出如何正确使用它们.如何在不使用详细while(hasNext()) getNext()
循环样式的情况下迭代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) } } }
小智.. 254
从Scala 2.8开始,您所要做的就是导入JavaConversions对象,该对象已经声明了适当的转换.
import scala.collection.JavaConversions._
但这在以前的版本中不起作用.
从Scala 2.8开始,您所要做的就是导入JavaConversions对象,该对象已经声明了适当的转换.
import scala.collection.JavaConversions._
但这在以前的版本中不起作用.
有一个包装类(scala.collection.jcl.MutableIterator.Wrapper
).所以,如果你定义
implicit def javaIteratorToScalaIterator[A](it : java.util.Iterator[A]) = new Wrapper(it)
然后它将充当Scala迭代器的子类,因此您可以这样做foreach
.
Scala 2.12.0已弃用scala.collection.JavaConverters
,因此从2.12.0开始,这样做的方法如下:
import scala.collection.JavaConverters._ // ... for(k <- javaCollection.asScala) { // ... }
(注意导入,new是JavaConverters,不推荐使用JavaConversions)
这里的正确答案是定义从Java Iterator
到某些自定义类型的隐式转换.此类型应实现foreach
委托给底层的方法Iterator
.这将允许您将Scala for
-loop与任何Java 一起使用Iterator
.
对于Scala 2.10:
// Feature warning if you don't enable implicit conversions... import scala.language.implicitConversions import scala.collection.convert.WrapAsScala.enumerationAsScalaIterator
使用Scala 2.10.4+(可能更早),可以通过导入scala.collection.JavaConversions.asScalaIterator将java.util.Iterator [A]隐式转换为scala.collection.Iterator [A].这是一个例子:
object SpreadSheetParser2 extends App { import org.apache.poi.hssf.usermodel.HSSFWorkbook import java.io.FileInputStream import scala.collection.JavaConversions.asScalaIterator val ios = new FileInputStream("data.xls") val workbook = new HSSFWorkbook(ios) var sheet = workbook.getSheetAt(0) val rows = sheet.rowIterator() for (row <- rows) { val cells = row.cellIterator() for (cell <- cells) { print(cell + ",") } println } }