[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください
ScalaのMap
クラスにおいて、キーや値が特定の条件に合致するもののみ抽出する方法についてご紹介します。
概要
キーや値が特定の条件に合致するもののみ抽出するにはfilter
メソッド、
合致しないもののみ抽出するにはfilterNot
メソッドを使用します。
この種の処理を行いたい場合はfor
式を使った方がより効率的に処理できます。
さて、早速ですが以下のMap
クラスのインスタンスについて見ていきましょう。
val map: Map[Int, String] = Map( 1 -> "apple", 2 -> "orange", 3 -> "grape", 4 -> "strawberry", )
filter メソッドの使い方
特定の条件を満たす要素のみをフィルタリングしたい場合は、filter
メソッドを使用します。
結果として出力された要素がいずれもfilter
メソッドの引数に渡した条件式を満たしており、
満たさない要素はすべて排除されていることを確認してください。
map.filter { case (id, _) => id % 2 == 1 } .foreachEntry((_, fruit) => println(fruit))
apple grape
filterNot メソッドの使い方
特定の条件を満たす要素を除外したい場合はfilterNot
メソッドを使用します。
結果として出力された要素がいずれもfilterNot
メソッドに引数として渡した条件式を満たしておらず、
条件に合致する要素はいずれも含まれていないことを確認してください。
map.filterNot { case (id, _) => id % 2 == 1 } .foreachEntry((_, fruit) => println(fruit))
orange strawberry
for 式で効率的に処理する方法
実は、for
式でもfilter
あるいはfilterNot
メソッド相当の処理を行うことができます。
書き方は、for
式の途中にif
文を追加するだけでOKです。
for { (id, fruit) <- map if id % 2 == 1 } println(fruit)
apple grape
for
式を使った方が効率的に処理できるので、特別な理由がない限りはfor
式を使うようにしましょう。
for
式を使った方が効率的になる理由は、
for
式の内部実装ではfilter
メソッドではなくwithFilter
メソッドを活用しているからです。
withFilter
メソッドにより、
中間コレクションを生成することなく次の処理を行うことができるので、効率的に処理できるのです。