Scala入門

Scalaに入門したので、覚書。

波括弧とブロック

  • 以下の2つは等価となる
// 波括弧()の中には式は1つしか書けない
scala> Seq(Seq(1,2),Seq(3,4)).flatten.map(a => a * 2)
res27: Seq[Int] = List(2, 4, 6, 8)

// ブロックの場合、2つ以上の式を {...} 内に書くことが可能
scala> Seq(Seq(1,2),Seq(3,4)).flatten.map { a => a * 2}
res28: Seq[Int] = List(2, 4, 6, 8)

mapの引数に _ を使うパターン

  • 以下2つは等価となる
scala> Seq(Seq(1,2),Seq(3,4)).flatten.map(a => a * 2)
res35: Seq[Int] = List(2, 4, 6, 8)

scala> Seq(Seq(1,2),Seq(3,4)).flatten.map(_ * 2)
res36: Seq[Int] = List(2, 4, 6, 8)

flatten

  • 入れ子構造になっているSeqを展開する事ができる
scala> Seq(Seq(1,2),Seq(3,4)).flatten
res14: Seq[Int] = List(1, 2, 3, 4)
  • 展開される入れ子構造は1階層のみ
scala> Seq(Seq(1,2),Seq(3,Seq(4,5,6))).flatten
res33: Seq[Any] = List(1, 2, 3, List(4, 5, 6))

flattenとflatMap

  • 以下の2つは等価となる -> つまり、flatMapはmapを実行後にflattenしてくれている??
scala> Seq("Hello","World").map(_.toSeq).flatten
res17: Seq[Char] = List(H, e, l, l, o, W, o, r, l, d)

scala> Seq("Hello","World").flatMap(_.toSeq)
res18: Seq[Char] = List(H, e, l, l, o, W, o, r, l, d)

メソッドのジェネリクス

// メソッドの宣言
scala> def method[T](t: T):T = { t }
method: [T](t: T)T

// 使用例 1
scala> val s = method(1)
s: Int = 1

// 使用例 2
scala> val s = method("Hello World")
s: String = Hello World

高階関数

// もらった引数を、コールバック関数に渡して実行するだけの関数
scala> def func(n: Int, f: Int => Int): Int = { f(n) }
func: (n: Int, f: Int => Int)Int

// 使用例
scala> func(2,  _ * 2)
res37: Int = 4
/* https://sunrise033.com/entry/hatena-blog-how-to-hierarchicalize-categories */