[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メソッドにより、
中間コレクションを生成することなく次の処理を行うことができるので、効率的に処理できるのです。