新人SEの学習記録

14年度入社SEの学習記録用に始めたブログです。もう新人じゃないかも…

学習記録:Scala

[学習記録] Scala

内容

変数宣言
  • 通常の変数
    • var 変数名:型 = 初期値
    • var 変数名 = 初期値
  • 定数
    • val 変数名:型 = 初期値
    • val 変数名 = 初期値
  • 初期値なしの変数宣言はできない
    • 初期値がない場合は _ を代入する(デフォルト値)
scala> var num:Int = 10
num: Int = 10

scala> var num = 10
num: Int = 10

scala> val msg = "hello"
msg: String = hello

scala> msg = "world"
<console>:8: error: reassignment to val
       msg = "world"
           ^
データ型
  • Byte, Short, Int, Long, Float, Double, Boolean, String, Char
    • Javaの基本型の先頭を大文字にしたもの
    • Scalaにはプリミティブ型はなく、全てオブジェクト型
    • Rubyのように数値に対してもメソッドが呼び出せる
scala> 10.toString
res0: String = 10
リテラル
  • 数値
    • 10進数、8進数(0の後に続ける)、16進数(0xの後に続ける)
    • Longリテラルを表すにはlかLを末尾につける
  • 浮動小数点数
    • 0.の後に続ける
    • Floatリテラルを表す場合はfかFを末尾につける
    • 指数表現も付加可能( 0.1e + 3 )
  • ブール
    • true/false
  • 文字・文字列
    • 文字は ' 文字列は " で囲む
    • """(ダブルクォート3つ)で囲むと生の文字列を扱う(エスケープシーケンスなどを無視しそのまま表示)
  • シンボル
    • '(シングルクォート)を名前の前に付ける
    • 同じ名前を持った二つのシンボルは同じオブジェクトを示す -> マップのキーとして使うことがある
scala> var s = 'symbol
s: Symbol = 'symbol
配列
  • Arrayを使用
    • JavaでいうArrayListみたいなもの
    • ()で配列の添字を指定
scala> val a1 = new Array[Int](10)
a1: Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

scala> val a2 = Array(1,2,3)
a2: Array[Int] = Array(1, 2, 3)

scala> a2(0)
res1: Int = 1

scala> a2(0) = 100

scala> a2(0)
res3: Int = 100

scala> a2.length
res4: Int = 3

scala> a2
res5: Array[Int] = Array(100, 2, 3)
コレクション
  • シーケンス型
    • Seqクラスを継承したListを主に使用
    • 先頭の追加・削除は高速だがランダムアクセスが遅い
scala> val list1 = List("Scala")
list1: List[String] = List(Scala)

scala> val list2 = "Java" :: list1
list2: List[String] = List(Java, Scala)

scala> list2.head
res0: String = Java

scala> list2.tail
res1: List[String] = List(Scala)

scala> list2.length
res2: Int = 2
scala> val map = Map[String,Int]("Scala"->1,"Java"->2)
map: scala.collection.immutable.Map[String,Int] = Map(Scala -> 1, Java -> 2)

scala> map("Java")
res3: Int = 2

scala> map("Clojure")
java.util.NoSuchElementException: key not found: Clojure

scala> map.size
res5: Int = 2
  • タプル型
    • Scala固有。異なる型の要素を格納可能
    • 値をカンマで区切り()で囲んで定義
    • 要素の取得には、「タプル型変数名._要素の番号」
    • メソッドからの戻り値で複数要素を返したいときなどに便利
scala> val t1 = ("Scala", 10)
t1: (String, Int) = (Scala,10)

scala> val t2 = ("Java", 20)
t2: (String, Int) = (Java,20)

scala> t2._1
res7: String = Java
条件分岐
  • if文
    • 最後に評価された値を返す
scala> var x = 0
x: Int = 0

scala> val result = if (x == 0) {
     | "x is zero"
     | } else {
     | "x is " + x
     | }
result: String = x is zero
  • for文
    • Scalaではfor文を使用することがとても多い
    • シンプルな繰り返しだけでなく、コレクションの精査やフィルタリングなど様々な処理を実現可能
    • for( [ジェネレータ] [フィルタ] ) 式
scala> val primes = List(2,3,5,7,9)
primes: List[Int] = List(2, 3, 5, 7, 9)

scala> for (
     | num <- primes
     | if num > 5
     | ) println("num = " + num)
num = 7
num = 9
  • while, do-while
  • 例外処理
    • Javaとほぼ一緒
    • catch内で例外クラスの型を指定する場合、case文を使用する
scala> try {
     |   "a".toInt
     | } catch {
     |   case e:NumberFormatException => {
     |     println("NFE!!")
     |   }
     | } finally {
     |   println("finally!")
     | }
NFE!!
finally!
res1: AnyVal = ()
基本的なパターンマッチ
  • match構文
    • breakは不要
    • _ はdefaultに相当
    • _ を記述せずに一つもmatchしなかった場合、MatchErrorが発生
比較したい値 match {
  case [選択肢] => [選択肢にmatchしたときの処理]
  case _ => [選択肢にmatchしなかったときの処理]
}
  • 基本的なマッチングとパターンガード
    • 選択肢には値の他に型なども指定可能
    • case文の=>の前にif文で任意の論理式を記述可能
scala> val x:Any = "Hello"
x: Any = Hello

scala> x match {
     |  case i:Int => println("int x = " + i.toString)
     |  case s:String => println("String x = " + s)
     | }
String x = Hello

その他