Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

今回は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トレイトのメソッドについて紹介してみたけどどうだった?

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away