Mapでイテレータを利用する方法

Scala 3 (Dotty 0.26.0-RC1) 2.13.3 2.12.12
最終更新:2020年5月19日

[AD] scalapediaでは記事作成ボランティアを募集しています

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においても、MapListなどのコレクションクラスを利用するのが好ましいです。

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)

サイト内検索