[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください
ScalaのMap
でイテレータを操作する方法を紹介します!
イテレータを取得して使う
Map
よりイテレータを取り出すには、iterator
メソッドを使います。
val m = Map("foo" -> 10, "bar" -> 20, "baz" -> 30) val itr = m.iterator
それでは、取得したイテレータをwhile
ループを使って利用してみましょう。
まずhasNext
メソッドで次の値が存在するかを判別し、次にイテレータからnext
メソッドで値を取得します。
while (itr.hasNext) val (key, value) = itr.next() println(s"key => $key, value => $value")
以下のように出力されます。
key => foo, value => 10 key => bar, value => 20 key => baz, value => 30
ScalaのMap
クラスにおいて、iterator
メソッドはJavaとの互換性を確保するために提供されています。
また、Javaにおいても、Java 8以降、Iterator
を利用する機会は減っています。なぜなら、Java 8にてStream API
が提供された結果、Iterator
クラスを積極的に利用する意義が失われたからです。
今でもIterator
クラスは以前のJavaとの互換性を保つため提供されていますが、あくまで使用するのはIterator
クラスのインスタンスを必要とするメソッドを使う場合などにとどめ、Iterator
クラスを新たに使うのは控えましょう。
Scalaにおいても、Map
やList
などのコレクションクラスを利用するのが好ましいです。
forでイテレータを利用する
Scalaではfor
を使うことでも、Map
の各要素を順次処理することができます。
val m = Map("foo" -> 10, "bar" -> 20, "baz" -> 30) for ((key, value) <- m) println(s"key => $key, value => $value")
こちらもイテレータを使った場合と同様に出力されます。
key => foo, value => 10 key => bar, value => 20 key => baz, value => 30
foreach メソッドを利用する
Map
にはforeach
というメソッドがあり、これを使って順次処理することも可能です。
val m = Map("foo" -> 10, "bar" -> 20, "baz" -> 30) m.foreach { case (key, value) => println(s"key => $key, value => $value") }
以下のように出力されます。
key => foo, value => 10 key => bar, value => 20 key => baz, value => 30
IteratorをMapに変換する
Iterator
からMap
に変換するにはtoMap
メソッドを利用します。
ただし、toMap
メソッドを利用するにはIterator
の要素が2つの要素で構成されたタプルである必要があります。
val itr: Iterator[(String, Int)] = Map("foo" -> 10, "bar" -> 20, "baz" -> 30).iterator val map = itr.toMap map.foreach(println)
以下のように出力されます。
(foo,10) (bar,20) (baz,30)