Je suis en train d'écrire un code Scala qui utilise la fonction POI Apache API. Je voudrais itérer sur les lignes contenues dans le fichier java.util.Iterator
que je reçois de la classe de feuille. Je voudrais utiliser l'itérateur dans un fichier de type for each
J'ai donc essayé de la convertir en une collection native Scala, mais sans succès.
J'ai examiné les classes/traits de wrapper Scala, mais je ne vois pas comment les utiliser correctement. Comment puis-je itérer sur une collection Java en Scala sans utiliser la fonction verbose ? while(hasNext()) getNext()
style de boucle ?
Voici le code que j'ai écrit en fonction de la bonne réponse :
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)
}
}
}
0 votes
Je n'arrive pas à inclure la ligne "for (val row <- rows){" sans que l'analyseur pense que le caractère '<' est une balise de fermeture XML ? Les barres obliques inversées ne fonctionnent pas.
0 votes
Vous devriez être en mesure de convertir en IteratirWrapper de manière implicite, ce qui vous permettra d'économiser une bonne partie de la syntaxe. Cherchez sur Google les conversions implicites en Scala.