高卒文系Scala vol.7 - Listの使い方 -


Scala本、3.2辺り。


ScalaではListが超重要だと個人的に感じましたが、

今の所はまず、Listクラスのメソッドがどのような動作をするのか、をしっかり理解しときたいと思いました。


なので、今回は楽をして、Scala本に載っている「重要なListメソッド」を自分で実際に使ってた例を挙げてみます。

個人的なListのリファレンスも兼ねてます。


Listの生成

val numbers = List(1, 2, 3)
val numbers2 = List.apply(4, 5, 6)

numbersとnumbers2の初期化方法は実質一緒。ListのコンパニオンオブジェクトのFactoryメソッドを呼び出しているだけ。


println("空List1        : " + Nil)
println("空List2        : " + List())
println("先頭要素に挿入 : " + (999 :: numbers2))
println("List生成       : " + ("aaa" :: "bbb" :: "cccc" :: Nil))
val numbers3 = numbers ::: numbers2
println("List連結       : " + numbers3)

NilもList()も要素数0の空List。

「::」は「cons」と呼ばれるもので、Listの右被演算子(メソッド)。

つまり「"aaa" :: “bbb” :: “cccc” :: Nil」は「Nil.::(“cccc”).::(“bbb”).::(“aaa”)」と同じ。

「:::」もメソッド。

二つのListの要素を持つListを返す。


空List1        : List()
空List2        : List()
先頭要素に挿入 : List(999, 4, 5, 6)
List生成       : List(aaa, bbb, cccc)
List連結       : List(1, 2, 3, 4, 5, 6)


要素に対する操作・要素数

println("List要素取得1  : " + numbers.apply(2))
println("List要素取得2  : " + numbers(2))
println("条件式を満たす要素の数     : " + numbers3.count(num => num % 2 == 0))
println("条件式trueとなる要素があるか  : " + numbers3.exists(num => num == 0))
println("Listの先頭の要素取得       : " + numbers3.head)
println("Listの最後の要素取得       : " + numbers3.last)
println("Listが空Listであるか       : " + numbers3.isEmpty)
println("Listの要素数               : " + numbers3.length)

List#applyはやっぱり省略できる。

countは引数に渡した関数がtrueを返す要素の数を返す。

existsは引数に渡した関数がtrueを返す要素が一つでもあればtrueを返す。


List要素取得1  : 3
List要素取得2  : 3
条件式を満たす要素の数     : 3
条件式trueとなる要素があるか  : false
Listの先頭の要素取得       : 1
Listの最後の要素取得       : 6
Listが空Listであるか       : false
Listの要素数              : 6


サブリストの取得

println("先頭から要素削除されたList : " + numbers3.drop(2))
println("後方から要素削除されたList : " + numbers3.dropRight(2))
println("先頭の要素を除いたList取得 : " + numbers3.tail)
println("最後の要素を除いたList取得 : " + numbers3.init)
println("条件式真となる要素以外のList : " + numbers3.remove(num => num % 2 == 0))
println("逆順Listを取得             : " + numbers3.reverse)
println("条件式真となる要素List取得  : " + numbers3.filter(num => num % 3 == 0))
println("全要素に関数を適用したList取得 : " + numbers3.map(num => num * 10))

filter、mapが個人的に超重要。

これを使いこなせるかどうかで、Scalaのプログラミングレベルに関わると思う。

SQLのイメージに近いかもしれない。

filterがwhere句の条件指定で、mapがselect句の列のデータ操作。


先頭から要素削除されたList : List(3, 4, 5, 6)
後方から要素削除されたList : List(1, 2, 3, 4)
先頭の要素を除いたList取得 : List(2, 3, 4, 5, 6)
最後の要素を除いたList取得 : List(1, 2, 3, 4, 5)
条件式真となる要素以外のList : List(1, 3, 5)
逆順Listを取得             : List(6, 5, 4, 3, 2, 1)
条件式真となる要素List取得  : List(3, 6)
全要素に関数を適用したList取得 : List(10, 20, 30, 40, 50, 60)

その他

println("全ての要素が条件式真になるか : " + numbers3.forall(num => num < 10))
print("全要素に対して関数実行     : ")
numbers3.foreach(num => print(" [" + num + "] "))
println("")
val strings = List("aaaaaa", "bb", "cccc")
println("ソート : " + strings.sort((s1, s2) => s1.length < s2.length))
println("Listの要素を並べた文字列    : " + numbers3.mkString(" < "))

forall、foreachも個人的に超重要。

sortはJavaのCollectios#sortと同じような使い方。

全ての要素が条件式真になるか : true
全要素に対して関数実行     :  [1]  [2]  [3]  [4]  [5]  [6]
ソート : List(bb, cccc, aaaaaa)
Listの要素を並べた文字列    : 1 < 2 < 3 < 4 < 5 < 6



やっぱり自分で書いてみて、実行してみなきゃダメですねー。

書いてみて思ったんですが、

JavaのコレクションフレームワークのListよりも、はるかに使いやすいですね。


Java7で関数オブジェクトが導入されたら、

Scalaでのあんな事やこんな事がJavaでもできるようになるんでしょうか?

このエントリーをはてなブックマークに追加
comments powered by Disqus