• Scala 基础(十四):Scala 模式匹配(二)


    1 匹配数组

    1)Array(0) 匹配只有一个元素且为0的数组。

    2)Array(x,y) 匹配数组有两个元素,并将两个元素赋值为x和y。当然可以依次类推Array(x,y,z) 匹配数组有3个元素的等等....

    3)Array(0,_*) 匹配数组以0开始

    应用案例

     2 匹配列表

    应用案例

    for (list <- Array(List(0), List(1, 0), List(0, 0, 0), List(1, 0, 0))) {
    val result = list match {
    case 0 :: Nil => "0" //
    case x :: y :: Nil => x + " " + y //
    case 0 :: tail => "0 ..." //
    case _ => "something else"
    }
    println(result)
    }

    3 匹配元组

    应用案例

    // 元组匹配// 元组匹配
    for (pair <- Array((0, 1), (1, 0), (1, 1),(1,0,2))) {
    val result = pair match { // 
    case (0, _) => "0 ..." //
    case (y, 0) => y // 
    case _ => "other" //.
    }
    println(result)
    }

    4 对象匹配

    对象匹配,什么才算是匹配呢?,规则如下:

    1)case中对象的unapply方法(对象提取器)返回Some集合则为匹配成功

    2)返回none集合则为匹配失败

    应用案例1

    object Square {
    def unapply(z: Double): Option[Double] = Some(math.sqrt(z))
    def apply(z: Double): Double = z * z
    }
    // 模式匹配使用:
    val number: Double = 36.0
    number match {
    case Square(n) => println(n)
    case _ => println("nothing matched")

    应用案例1的小结

    1)构建对象时apply会被调用 ,比如 val n1 = Square(5)

    2)当将 Square(n) 写在 case 后时[case Square(n) => xxx],会默认调用unapply 方法(对象提取器)

    3)number 会被 传递给def unapply(z: Double) 的 z 形参

    4)如果返回的是Some集合,则unapply提取器返回的结果会返回给 n 这个形参

    5)case中对象的unapply方法(提取器)返回some集合则为匹配成功

    6)返回none集合则为匹配失败

    应用案例2

    object Names {
    def unapplySeq(str: String): Option[Seq[String]] = {
    if (str.contains(",")) Some(str.split(","))
    else None
    }}
    val namesString = "Alice,Bob,Thomas"
    //说明
    namesString match {
    case Names(first, second, third) => {
    println("the string contains three people's names")
    // 打印字符串
    println(s"$first $second $third")
    }
    case _ => println("nothing matched")
    }

     

  • 相关阅读:
    对面向对象设计原则的总结
    sql server连接字符串
    js页面加载进度条
    Yui.Compressor高性能ASP.NET开发:自动压缩CSS、JS
    asp.net利用多线程执行长时间的任务,客户端显示出任务的执行进度的示例(一)_转
    asp.net删除目录,Session丢失
    extjs ComboBox使用注意
    转:使Eclipse的智能感知可以像 Visual Studio 一样快速提示
    Android ContentProvider 填删改查 实例
    Windows Phone StackPanel 布局示例
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/13266146.html
Copyright © 2020-2023  润新知