ScalaにはJavaのswitch文と同じような機能を持つmatch-case文がある。
この条件分岐の記述とラムダ式をミックスして利用することも出来る。
match-case文
Javaのswitch文とは違い、caseの後にbreak;を書く必要はなく、使い方はほぼほぼ同じで
val num = 1 num match { case 1 => println("one") case 2 => println("two") case 3 => println("three") case 4 => println("four") case 5 => println("five") case _ => println("other") }
こんな感じになる。
変数numの値に応じて処理を振り分ける。
どれにもマッチしないものを表すときはdefaultではなく”_”を使う。
この実行結果はもちろん”one”と出力されて終わる。
match-caseで値を返す
実はScalaのこのmatch-case文は値を返すこともできる。
そしてその値はラムダ式を返すことも可能である。
先ほどのコードを少し変更して実行をしてみる。
val num = 5 val result = num match { case 1 => () => println("one") case 2 => () => println("two") case 3 => () => println("three") case 4 => () => println("four") case 5 => () => println("five") case _ => () => println("other") } result()
matchの前に変数宣言が行われている。そしてcase式の中身を少し変更した。
これはどういうことかというと、numの値に応じてヒットしたcase式の処理が行われるが、上で書いたようにmatch-case文は値を返すことができる。
なのでマッチしたところのラムダ式を返すように変更した。
引数は受け取らず、文字列を出力するというラムダ式だ。
そのラムダ式をresultという変数で受け取って、最後に呼び出して処理を行っている状態である。
実際に実行してみると
username$ scala match.scala five
このようになる。
文字列の判定
上の例ではInt型を判定させたが、もちろん文字列でも可能で
val calc = "-" val input1 = 5 val input2 = 7 val result = calc match { case "+" => (num1: Int, num2: Int) => println(num1 + num2) case "-" => (num1: Int, num2: Int) => println(num1 - num2) case "*" => (num1: Int, num2: Int) => println(num1 * num2) case "/" => (num1: Int, num2: Int) => println(num1 / num2) case _ => (num1: Int, num2: Int) => println("でなおせ") } result(input1, input2)
このように、変数calcに格納されている演算子の文字列に応じて処理を振り分けることもできる。
username$ scala match.scala -2
calcを”@”に変更して実行してみると
username$ scala match.scala でなおせ
このような結果となる。
ラムダ式を使うことでオブジェクト思考言語のポリモーフィズム的なことがサクッと実現することができる。
コメント