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