Iterating over Java collections in Scala
collections, java, scala, scala-java-interop
Solution
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)
then it will act as a sub class of the Scala iterator so you can do `foreach`.
Problem
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. 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) } } } ```