您的位置:首页 > 其它

Scala模式匹配语法讲解

2017-04-29 19:13 441 查看
scala中的模式匹配,类似于java中的 switch-case 语法,它有三种实现:
(1)x match(arg:type) - case XXXX => {…} case YYYY
(2)使用样例类实现模式匹配
(3)使用偏函数实现模式匹配

——————
(1)x match(arg:type) - case XXXX => {…} case YYYY
scala的模式匹配规则:只要发现有一个匹配的case,其余的case就不会继续匹配了

【例一】
object ScalaPatternTest1 {
    //参数是整型. 返回值类型是字符串。具体返回的字符串由匹配的参数值来决定
    def test_match(x:Int) :String = x match {
        case 0 => "It's empty"
        case 1 => "It has one"
        case _ => "More than one"// 默认通配选项,即“未匹配到任一个case时的选项”
    }

    def main(args: Array[String]) {
        println(test_match(5))
        println(test_match(0))
        println(test_match(1))
    }
}

例一的输出结果:
More than one
It's empty
It has one

【例二】
object ScalaPatternTest2{
    //参数可以是任意类型(Any是Int,String,Boolean的超类,类似java中的Object)
    //具体的返回值由匹配的实参决定
    def test_match2(arg:Any) :Any = arg match {
        case 10 => "ten"
        case "three" => 3
        case arg: Boolean => arg//如果传入的参数是布尔值,则返回参数本身
        case arg: Int => "your input is: Scala.Int"  //判断输入的实参类型是不是整型
        case _ => "other input"
    }

    def main(args: Array[String]) {
        println(test_match2(true))
        println(test_match2(10))
        println(test_match2("three"))
        println(test_match2(100))
        println(test_match2("good afternoon"))
    }
}

例二的输出结果:
true
ten
3
your input is: Scala.Int
other input

———————

(2)使用样例类实现模式匹配
scala的样例类说明:
主要用于模式匹配.
内置了apply和unapply方法,还有串行化等接口.
创建对象时不需要使用new.

语法:case关键字+class+类名

【例】
object CaseClassTest {
    /*
    使用样例类实现模式匹配
     */
    def main(args: Array[String]) {
        val cindy = User("Cindy", 24, "Los Angeles")
        val karl = User("Karl", 27, "Sydney")
        val alice = User("Alice", 21, "Beijing")
        for (u <- List(cindy, alice,karl)) {
            u match {
                case User("Tony_kidkid", 27,"Beijing") => println("what's up?tony")
                case User("Alice", 21, "Beijing") => println("hi~ Alice")
                case User("Karl", 27, "Sydney") => println("hi~ Karl")
                case User("Cindy", 24, "Los Angeles") => println("hi~ Cindy")
            }
        }
    }
    case class User(name: String, age: Int, city: String)

}

输出结果:
hi~ Cindy
hi~ Alice
hi~ Karl

————————-

(3)使用偏函数实现模式匹配

object PartialFuncTest {
    def main(args: Array[String]) {
        /*定义变量,将会传给偏函数tony_kid
        * var表示是变量,可重新赋值;val表示常量,不可重新赋值
        */
        var var1 = 1
        var var0 = 0
        var var_x = “evening”
       //调用偏函数
        println(tony_kid(var1))
        println(tony_kid(var0))
        var0 = 10
        println(tony_kid(var0))

        //报错:传入的数据类型不是声明的Int
        //tony_kid(var_x)
    }

    //定义一个偏函数. 规定了传入的类型和返回类型分别是Int、String
    val tony_kid: PartialFunction[Int, String] = {
        case 0 => "zero"
        case 1 => "more than zero"
        case _ => "既不是 0 也不是 1"
    }
}

输出结果:
more than zero
zero
既不是 0 也不是 1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: