第10章：Scalaの「Traversable」リファレンス

今回はCollection パッケージの「Traversable」ついて、
リファレンス風に紹介するよ。

- scala.collection.Traversable

このトレイトは、コレクションの中でも上位トレイトで重要なメソッドを持っているんだ。
どんな操作が存在するか実際に実行して感じてみてね！

入門編としてこちらも必読(^^)v
[ 第8章：Scalaのコレクション(Seq, Set, Map)入門](http://qiita.com/f81@github/items/dc79819d23ce4889d552)

# scala.collection.Traversable
コレクション階層の基本となるトレイト。Seqだけではなく、Set・Mapもこのトレイトをミックスインしている。
`foreach`メソッドのみが抽象メソッド。このメソッド以外はTraversableLikeに実装が用意されている。

代表的なメソッドを使ってみたよ。

## 抽象メソッド
### foreach
全走査して要素を1回ずつ処理する

```scala
scala> Seq(1, 2, 3).foreach(print(_))
123
```

## 加算・追加
### ++
2つのコレクションから1つの新しいコレクションを返す

```scala
scala> Seq(1, 2, 3) ++ Seq(4, 5)
res1: Seq[Int] = List(1, 2, 3, 4, 5)
```

## マップ
### map
全ての要素に関数を適用したコレクションを返す

```scala
scala> Seq("a", "b", "c") map (_.toUpperCase())
res2: Seq[java.lang.String] = List(A, B, C)
```
### flatMap
全ての要素に関数を適用した返ったコレクションを、更に一つのコレクションとして返す

```scala
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
scala> Seq(1, 2, 3) collect { case (i) if (i % 2 == 1) => i + 1 }
res4: Seq[Int] = List(2, 4)
```

### toArray
配列に変換する

```scala
scala> Seq(1, 2, 3) toArray
res5: Array[Int] = Array(1, 2, 3)
```

### toIterable
イテラブルに変換する

```scala
scala> Seq(1, 2, 3) toIterable
res6: Iterable[Int] = List(1, 2, 3)
```

### toList
Listに変換する

```scala
scala> Seq(1, 2, 3) toList
res7: List[Int] = List(1, 2, 3)
```

### toMap
Mapに変換する

```scala

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
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
scala> Seq(1, 2, 3, 1) toSet
res10: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
```

### toStream
Streamに変換する

```scala
scala> Seq(1, 2, 3, 1) toStream
res11: scala.collection.immutable.Stream[Int] = Stream(1, ?)
```

### copyToArray
配列に要素をコピーする

```scala
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
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
scala> Seq(1, 2, 3) isEmpty
res14: Boolean = false

scala> Seq() isEmpty
res15: Boolean = true
```

### nonEmpty
要素があるか判定する

```scala
scala> Seq(1, 2, 3) nonEmpty
res16: Boolean = true

scala> Seq() nonEmpty
res17: Boolean = false
```

### size
要素数を返す

```scala
scala> Seq(1, 2, 3) size
res18: Int = 3
```

### find
関数を満たすファーストヒットを返す

```scala
scala> Seq(1, 2, 3) find (_ > 1)
res19: Option[Int] = Some(2)
```

### head
先頭要素を返す

```scala
scala> Seq(1, 2, 3) head
res20: Int = 1
```

### headOption
先頭要素をオプション値として返す

```scala
scala> Seq(1, 2, 3) headOption
res21: Option[Int] = Some(1)
```

### last
末尾要素を返す

```scala
scala> Seq(1, 2, 3) last
res22: Int = 3
```

### lastOption
末尾要素をオプション値として返す

```scala
scala> Seq(1, 2, 3) lastOption
res23: Option[Int] = Some(3)
```

### init
`last`を除いた残りを返す

```scala
scala> Seq(1, 2, 3) init
res24: Seq[Int] = List(1, 2)
```

### take
最初のn個の要素から成るコレクションを返す

```scala
scala> Seq(1, 2, 3, 4, 5) take(2)
res25: Seq[Int] = List(1, 2)
```

### drop
`take`を除いた残りを返す

```scala
scala> Seq(1, 2, 3) drop(2)
res26: Seq[Int] = List(3)
```

### filter
関数を満たす要素から成るコレクションを返す

```scala
scala> Seq(1, 2, 3) filter (_ % 2 == 1)
res27: Seq[Int] = List(1, 3)
```

### filterNot
関数を満たさない要素から成るコレクションを返す

```scala
scala> Seq(1, 2, 3) filterNot(_ % 2 == 1)
res28: Seq[Int] = List(2)
```

### slice
fromからtoまでの要素から成るコレクションを返す

```scala
scala> Seq(1, 2, 3, 4, 5) slice(2, 4)
res29: Seq[Int] = List(3, 4)
```

### tail
`head`を除いた残りを返す

```scala
scala> Seq(1, 2, 3, 4, 5) tail
res30: Seq[Int] = List(2, 3, 4, 5)
```

### count
関数を満たす要素の数を返す

```scala
scala> Seq(1, 2, 3, 4, 5) count (_ % 2 == 0)
res31: Int = 2
```

### exists
関数を満たす要素があるか判定する

```scala
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
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
scala> Seq(1, 2, 3, 4, 5) partition(_ > 3)
res35: (Seq[Int], Seq[Int]) = (List(4, 5),List(1, 2, 3))
```

### span
先頭から関数を満たす要素・満たさなくなってから最後までの要素、それぞれのコレクションを含んだマップを返す

```scala
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
scala> Seq(1, 2, 3, 4, 5) splitAt (3)
res37: (Seq[Int], Seq[Int]) = (List(1, 2, 3),List(4, 5))
```

### foldLeft
引数と先頭の要素から順番に演算をする

```scala
scala> Seq(1, 2, 3).foldLeft(10)(_ - _)
res38: Int = 4
```

### foldRight
引数と末尾の要素から順番に演算をする

```scala
scala> Seq(1, 2, 3).foldRight(10)(_ - _)
res39: Int = -8
```

### reduceLeft
先頭の要素から順番に演算をする

```scala
scala> Seq(1, 2, 3).reduceLeft(_ - _)
res40: Int = -4
```

### reduceRight
末尾の要素から順番に演算をする

```scala
scala> Seq(1, 2, 3).reduceRight(_ - _)
res41: Int = 2
```

### sum
要素の値の合計を返す

```scala
scala> Seq(1, 2, 3).sum
res42: Int = 6
```

### product
要素の値の積を返す

```scala
scala> Seq(1, 2, 3).product
res43: Int = 6
```

### min
最小値を返す

```scala
scala> Seq(1, 2, 3) min
res44: Int = 1
```

### max
最大値を返す

```scala
scala> Seq(1, 2, 3) max
res45: Int = 3
```

### addString
要素を文字列としてStringBuilderに追加する

```scala
scala> var builder = new StringBuilder
builder: StringBuilder =

scala> Seq(1, 2, 3) addString(builder)
res46: StringBuilder = 123
```

### mkString
要素を区切り文字で連結した文字列を返す

```scala
scala> Seq(1, 2, 3) mkString ("a")
res47: String = 1a2a3
```

### view
ビューを生成する。

```scala
scala> Seq(1, 2, 3) view
res48: java.lang.Object with scala.collection.SeqView[Int,Seq[Int]] = SeqView(..)
```

# まとめ
今回は、 コレクションのTraversableトレイトのメソッドについて紹介してみたけどどうだった？

やっぱりこの辺は体を動かさないとわからないね。
ぜひぜひソースを書いて動かしてみてね。

今回も
__体で感じてくれたかな？__