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)
- プレースホルダ構文という名称のようです
参考: 元インフラエンジニアが Scalaを触ってつまづいたところ。 P28
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