Scala 式結果の変数代入と関数オブジェクトについての学習

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

変数の遅延評価

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
}