変数の遅延評価
lazyキーワードを使用するとその変数にアクセスするまで評価が遅延する。
scala> val date = new java.util.Date date: java.util.Date = Wed May 06 18:59:57 JST 2020 scala> lazy val date = new java.util.Date date: java.util.Date = <lazy> scala> date res10: java.util.Date = Wed May 06 19:00:24 JST 2020
変数の代入に式を用いる
{}
で囲んだブロックを変数に代入すると、式を評価した後、最終行が返す値を変数に束縛する。
scala> lazy val lazyData = { | println("assign var") | "Data" | } lazyData: String = <lazy> scala> lazyData assign var res13: String = Data scala> lazyData res14: String = Data scala> val data = { | println("assign var") | "Data" | } assign var data: String = Data scala> data res19: String = Data
関数オブジェクト
メソッドの定義
scala> def printData(src:String):Unit = println(src) printData: (src: String)Unit scala> printData("execute method") execute method
メソッドから関数オブジェクトの生成は以下のように末尾に空白+_
を付けると生成できる。
scala> val p = printData _ p: String => Unit = $$Lambda$945/1355234036@494defe3 scala> p("execute by function object") execute by function object
または以下のように無名関数から生成できる。
scala> val pd = (src:String) => println(src) pd: String => Unit = $$Lambda$950/855115138@2b6ce68a
if式
ifは式で評価した値を返せる。つまり以下のように記述できる。else
を記述しないとUnitを返す可能性があるので注意。
val ret:String = if( true ){ "Hello World" }else{ "Scala" }
もしくは、
val ret:Any = if( true ){ "Hello World" }
パターンマッチ
パターンマッチと式を組み合わせた例。束縛した値の式の評価結果もマッチの条件に含める。
val num: Int = Some(-1) match { case Some(num) if num < 0 => 0 case Some(num) => num }
リンク
リンク