1. ホーム
  2. java

[解決済み] ScalaでJavaのコレクションを反復処理する

2022-05-15 05:33:52

質問

Scalaのコードで Apache POI API を使用する Scala コードを書いています。に含まれる行を反復処理したいと思います。 java.util.Iterator に含まれる行を反復処理したい。このイテレータを for each スタイルのループで使用したいので、それをネイティブのScalaコレクションに変換しようとしていますが、うまくいきません。

Scalaのラッパークラス/トレイトを見ましたが、それらを正しく使用する方法がわかりません。Scala で Java コレクションを反復処理する際に、冗長な 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)
        }
    }
}

どのように解決するのですか?

ラッパークラス( scala.collection.jcl.MutableIterator.Wrapper ). そのため、もしあなたが

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

とすると、Scala のイテレータのサブクラスとして動作するので、次のようなことができます。 foreach .