今回はCollection パッケージの「Traversable」ついて、
リファレンス風に紹介するよ。
- scala.collection.Traversable
このトレイトは、コレクションの中でも上位トレイトで重要なメソッドを持っているんだ。
どんな操作が存在するか実際に実行して感じてみてね!
入門編としてこちらも必読(^^)v
第8章:Scalaのコレクション(Seq, Set, Map)入門
scala.collection.Traversable
コレクション階層の基本となるトレイト。Seqだけではなく、Set・Mapもこのトレイトをミックスインしている。
foreach
メソッドのみが抽象メソッド。このメソッド以外はTraversableLikeに実装が用意されている。
代表的なメソッドを使ってみたよ。
抽象メソッド
foreach
全走査して要素を1回ずつ処理する
scala> Seq(1, 2, 3).foreach(print(_))
123
加算・追加
++
2つのコレクションから1つの新しいコレクションを返す
scala> Seq(1, 2, 3) ++ Seq(4, 5)
res1: Seq[Int] = List(1, 2, 3, 4, 5)
マップ
map
全ての要素に関数を適用したコレクションを返す
scala> Seq("a", "b", "c") map (_.toUpperCase())
res2: Seq[java.lang.String] = List(A, B, C)
flatMap
全ての要素に関数を適用した返ったコレクションを、更に一つのコレクションとして返す
scala> Seq("red", "blue", "yellow") flatMap (_.toList)
res3: Seq[Char] = List(r, e, d, b, l, u, e, y, e, l, l, o, w)
collect
filterとmapを組みわせような感じ
scala> Seq(1, 2, 3) collect { case (i) if (i % 2 == 1) => i + 1 }
res4: Seq[Int] = List(2, 4)
toArray
配列に変換する
scala> Seq(1, 2, 3) toArray
res5: Array[Int] = Array(1, 2, 3)
toIterable
イテラブルに変換する
scala> Seq(1, 2, 3) toIterable
res6: Iterable[Int] = List(1, 2, 3)
toList
Listに変換する
scala> Seq(1, 2, 3) toList
res7: List[Int] = List(1, 2, 3)
toMap
Mapに変換する
scala> Seq((1,"Moses"), (2,"Lucas"), (3,"Henderson")) toMap
res8: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> Moses, 2 -
> Lucas, 3 -> Henderson)
toSeq
Seqに変換する
scala> Map(1 -> "Moses", 2 -> "Lucas", 3 -> "Henderson").toSeq
res9: Seq[(Int, java.lang.String)] = ArrayBuffer((1,Moses), (2,Lucas), (3,Hender
son))
toSet
Setに変換する
scala> Seq(1, 2, 3, 1) toSet
res10: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
toStream
Streamに変換する
scala> Seq(1, 2, 3, 1) toStream
res11: scala.collection.immutable.Stream[Int] = Stream(1, ?)
copyToArray
配列に要素をコピーする
scala> var array = Array(4, 5, 6, 7, 8)
array: Array[Int] = Array(4, 5, 6, 7, 8)
scala> Seq(1, 2, 3) copyToArray (array)
scala> array
res12: Array[Int] = Array(1, 2, 3, 7, 8)
copyToBuffer
Bufferに要素をコピーする
scala> var buffer = scala.collection.mutable.Buffer(4, 5, 6, 7, 8)
buffer: scala.collection.mutable.Buffer[Int] = ArrayBuffer(4, 5, 6, 7, 8)
scala> Seq(1, 2, 3) copyToBuffer (buffer)
scala> buffer
res13: scala.collection.mutable.Buffer[Int] = ArrayBuffer(4, 5, 6, 7, 8, 1, 2, 3)
isEmpty
要素が空か判定する
scala> Seq(1, 2, 3) isEmpty
res14: Boolean = false
scala> Seq() isEmpty
res15: Boolean = true
nonEmpty
要素があるか判定する
scala> Seq(1, 2, 3) nonEmpty
res16: Boolean = true
scala> Seq() nonEmpty
res17: Boolean = false
size
要素数を返す
scala> Seq(1, 2, 3) size
res18: Int = 3
find
関数を満たすファーストヒットを返す
scala> Seq(1, 2, 3) find (_ > 1)
res19: Option[Int] = Some(2)
head
先頭要素を返す
scala> Seq(1, 2, 3) head
res20: Int = 1
headOption
先頭要素をオプション値として返す
scala> Seq(1, 2, 3) headOption
res21: Option[Int] = Some(1)
last
末尾要素を返す
scala> Seq(1, 2, 3) last
res22: Int = 3
lastOption
末尾要素をオプション値として返す
scala> Seq(1, 2, 3) lastOption
res23: Option[Int] = Some(3)
init
last
を除いた残りを返す
scala> Seq(1, 2, 3) init
res24: Seq[Int] = List(1, 2)
take
最初のn個の要素から成るコレクションを返す
scala> Seq(1, 2, 3, 4, 5) take(2)
res25: Seq[Int] = List(1, 2)
drop
take
を除いた残りを返す
scala> Seq(1, 2, 3) drop(2)
res26: Seq[Int] = List(3)
filter
関数を満たす要素から成るコレクションを返す
scala> Seq(1, 2, 3) filter (_ % 2 == 1)
res27: Seq[Int] = List(1, 3)
filterNot
関数を満たさない要素から成るコレクションを返す
scala> Seq(1, 2, 3) filterNot(_ % 2 == 1)
res28: Seq[Int] = List(2)
slice
fromからtoまでの要素から成るコレクションを返す
scala> Seq(1, 2, 3, 4, 5) slice(2, 4)
res29: Seq[Int] = List(3, 4)
tail
head
を除いた残りを返す
scala> Seq(1, 2, 3, 4, 5) tail
res30: Seq[Int] = List(2, 3, 4, 5)
count
関数を満たす要素の数を返す
scala> Seq(1, 2, 3, 4, 5) count (_ % 2 == 0)
res31: Int = 2
exists
関数を満たす要素があるか判定する
scala> Seq(1, 2, 3, 4, 5) exists (_ > 4)
res32: Boolean = true
scala> Seq(1, 2, 3, 4, 5) exists (_ > 5)
res33: Boolean = false
groupBy
関数を満たす・満たさない要素、それぞれのコレクションを含んだマップを返す
scala> Seq(1, 2, 3, 4, 5) groupBy(_ > 3)
res34: scala.collection.immutable.Map[Boolean,Seq[Int]] = Map(false -> List(1, 2, 3), true -> List(4, 5))
partition
関数を満たす要素・満たさない要素、それぞれのコレクションを含んだマップを返す
scala> Seq(1, 2, 3, 4, 5) partition(_ > 3)
res35: (Seq[Int], Seq[Int]) = (List(4, 5),List(1, 2, 3))
span
先頭から関数を満たす要素・満たさなくなってから最後までの要素、それぞれのコレクションを含んだマップを返す
scala> Seq(1, 2, 3, 4, 5) span(_ % 2 == 1)
res36: (Seq[Int], Seq[Int]) = (List(1),List(2, 3, 4, 5))
splitAt
n番目で分割したコレクションのコレクションを返す
scala> Seq(1, 2, 3, 4, 5) splitAt (3)
res37: (Seq[Int], Seq[Int]) = (List(1, 2, 3),List(4, 5))
foldLeft
引数と先頭の要素から順番に演算をする
scala> Seq(1, 2, 3).foldLeft(10)(_ - _)
res38: Int = 4
foldRight
引数と末尾の要素から順番に演算をする
scala> Seq(1, 2, 3).foldRight(10)(_ - _)
res39: Int = -8
reduceLeft
先頭の要素から順番に演算をする
scala> Seq(1, 2, 3).reduceLeft(_ - _)
res40: Int = -4
reduceRight
末尾の要素から順番に演算をする
scala> Seq(1, 2, 3).reduceRight(_ - _)
res41: Int = 2
sum
要素の値の合計を返す
scala> Seq(1, 2, 3).sum
res42: Int = 6
product
要素の値の積を返す
scala> Seq(1, 2, 3).product
res43: Int = 6
min
最小値を返す
scala> Seq(1, 2, 3) min
res44: Int = 1
max
最大値を返す
scala> Seq(1, 2, 3) max
res45: Int = 3
addString
要素を文字列としてStringBuilderに追加する
scala> var builder = new StringBuilder
builder: StringBuilder =
scala> Seq(1, 2, 3) addString(builder)
res46: StringBuilder = 123
mkString
要素を区切り文字で連結した文字列を返す
scala> Seq(1, 2, 3) mkString ("a")
res47: String = 1a2a3
view
ビューを生成する。
scala> Seq(1, 2, 3) view
res48: java.lang.Object with scala.collection.SeqView[Int,Seq[Int]] = SeqView(..)
まとめ
今回は、 コレクションのTraversableトレイトのメソッドについて紹介してみたけどどうだった?
やっぱりこの辺は体を動かさないとわからないね。
ぜひぜひソースを書いて動かしてみてね。
今回も
体で感じてくれたかな?