強化版switch-case的な
値のパターンマッチ
val value: Int = 0 // パターンマッチ用
val matched: String = value match {
case 0 => "0だよ"
case 1 => "1だよ"
case 2 => "2だよ"
case _ => "その他だよ"
} // matched: String = "0だよ"
型のパターンマッチ
val value: Int = 0 // パターンマッチ用
val matched: String = value match {
case Int => "整数型だよ"
case String => "文字列型だよ"
case _ => "その他だよ"
} // matched: String = "整数型だよ"
マッチしつつ変数に束縛
val value: Int = 0 // パターンマッチ用
val matched: String = value match {
case intVal: Int => s"整数型だよ, intVal=$intVal"
case strVal: String => s"文字列型だよ, strVal=$strVal"
case _ => "その他だよ"
} // matched: String = "整数型だよ"
シーケンスとマッチ
val value: List[Int] = List(1, 2, 3)
val matched: String = value match {
case List(1, 2, 3) => "type A" // [1, 2, 3]にマッチ
case List(4, 5, 6) => "type B" // [4, 5, 6]にマッチ
case List(1, _, _) => "type C" // 1から始まる要素数3のListにマッチ
case List(1, a, b, c) -> "type D" // 1から始まる要素数4のListにマッチして, 各値を束縛
case List(1, _*) => "type D" // 1から始まる任意の要素にマッチ
case _ => "Else"
}
コンストラクタでマッチ
val human: Human = new Human(name="taro", male="男", age=20)
val matched: String = match human {
case Human(name=_, male="男", age=_) => "男性"
case Human(name=_, male="女", age=_) => "女性"
case _ => "性別不詳"
}
もっと柔軟に
ifで条件式を追加
25 match {
case x: Int if x >= 10 => "10以上の整数"
case x: Int => "10より小さい整数"
case _ => "それ以外"
}
OR条件で羅列
2 match {
case 1 | 2 | 3 => "type 1"
case _ => "type 2"
}