Statistical Programming

Scala immutableなコレクションと便利なメソッド

関数型言語定番のimmutableなデータ構造がScalaのひとつの特徴ですが、今回はimmutableなデータの集まりであるコレクションとそれを扱う便利メソッドについてです(Javaではimmutableで変更不可なデータはfinalキーワードを用いて特別に定義していましたよね)。コレクションの使用を容易にしてくれるメソッド群はTraversableトレイトをミックスインして作られ、そのトレイトには高階関数が含まれています。説明よりコードの方がわかりやすいでしょうしさっそく代表的なものから紹介していきます。

 

<要素表示に使えるforeachメソッド>

def foreach(f:(A)=>Unit):Unit

foreachは関数型の引数を一つ受け取り戻り値がUnitであるメソッドです。

foreachは受け取った関数を、コレクションが持っている要素すべてに適用します。

注意点としては、foreachで受け取る関数はコレクションの要素の型を受け取ることのできる関数である必要があります。

:入力

val list1=List(1,2,3,4,5)

list1.foreach(println) 

 :出力

1

2

3

4

5

  ここではリストコレクションに対してforeachメソッドを行っており、その引数としてprintlnメソッドを渡しています。要素の中身を加工しないで何かしらの処理を行いたい時に便利な機能です。

 

<要素を加工するmapメソッド>

def map[B](f:(A)=>B):CC[B]

mapは関数型の引数を一つだけ受け取り、戻り値が別のオブジェクトのコレクションであるメソッドです。そしてmapが受け取る関数は引数を一つだけ受け取り戻り値が別のオブジェクトである関数です。一言でいうと、コレクションの各要素を関数で加工しその結果を新たなコレクションとして返すということです。

:入力

val list=List("a","b","c")

list.map(_.toUpperCase).foreach(println)

:出力

A

B

C

 

<その名のとおりfilterメソッド>

filterメソッドはコレクションのすべての要素に対し、引数で渡した条件チェックの関数を実行し、true要素のみのコレクションを返します。

 def filter(p:(A)=>Boolean):Traversable[A]

このメソッドはまさにコレクションをフィルターにかける要領で簡単に好ましくない要素を排除することができます。

入力;

val list1=List(1,2,3,4,5,4)

list1.filter(_ > 3).foreach(println)

 

出力; 

4

5

4

このようにScalaにはコレクションを横断的に処理する機能が豊富に備えられています。