<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] # 簡介 與default等效的捕獲所有的`case _` 模式.如果沒有模式匹配,拋出MatchError,每個case中,不用break語句.可以在match中使用任何類型,而不僅僅是數字 # 完全匹配 ~~~ object CaseDemo extends App { val arr = Array("111", "222", "333") val name = arr(Random.nextInt(arr.length)) println(name) name match { case "111" => println("111") case "222" => println("222") case _ => println("nnnnnnnn") } } ~~~ # 類型匹配 ~~~ object CaseDemo2 extends App { val arr = Array("hello", 1, -2.0, CaseDemo2) val elem = arr(2) println(elem) elem match { case x: Int => println("Int " + x) case y: Double if(y>=0) => println("Double " + y) case z: String => println("String " + z) case CaseDemo2 => { println("case demo 2") } case _ => { println("default") } } # 打印類型 println(elem.getClass.getName) } ~~~ 提示: Map類型的泛型在匹配的時候,會自動刪除泛型類型,只會匹配到Map類型,而不會精確到Map里面的泛型類型 ~~~ var obj = Map("a" -> 1) obj match { case m1: Map[String, String] => println("這是Map[String, String]") case m2: Map[String, Int] => println("這是Map[String, Int]") } println(obj + " : " + obj.getClass.getName) ~~~ # 數組匹配 ~~~ object CaseDemo3 extends App { val arr = Array(0, 1, 7, 0) arr match { case Array(1, 5, x, y) => println(x + " " + y) case Array(1, 1, x, y) => println("only 0") # 匹配數組從0開始 case Array(0, _*) => println("0...") case _ => println("something else") } } ~~~ # 鏈表匹配 ~~~ object CaseDemo4 extends App { val lst = List(0, 1) lst match { //Nil代表空列表 List(0) case 0 :: Nil => println("only 0") //s方式拼接字符串 case x :: y :: Nil => println(s"x $x y $y") case 0 :: a => println(s"0 ... $a") case _ => println("something else") } } ~~~ # 元組匹配 ~~~ object CaseDemo5 extends App { val tup = (6, 3, 5) tup match { case (1, x, y) => println(s"hello 123 $x, $y") case (_, z, 5) => println(z) case _ => println("else") } } ~~~ # 類匹配 ~~~ //可以模式匹配 case class SubmitTask(id: String, name: String) case class HeartBeat(time: Long) case object CheckTimeOutTask object CaseDemo4 extends App { val arr = Array(CheckTimeOutTask, HeartBeat(123), HeartBeat(88888), new HeartBeat(88888), SubmitTask("0001", "task-0001")) val a = arr(Random.nextInt(arr.length)) println(a) a match { case SubmitTask(id, name) => { println(s"$id, $name") } case HeartBeat(time) => { println(time) } case CheckTimeOutTask => { println("check") } } } ~~~ # 偏函數 被包在花括號內沒有match一組case語句是一個偏函數,它是`PartialFunction[A,B]`的一個實例,A代表參數類型,B代表返回實例,常用輸入模式匹配 ~~~ object PartialFuncDemo { //偏函數 def func1: PartialFunction[String, Int] = { case "one" => 1 case "two" => 2 case _ => -1 } //其他方式實現 def func2(num: String): Int = num match { case "one" => 1 case "two" => 2 case _ => -1 } def main(args: Array[String]): Unit = { println(func1("one")) println(func2("one")) } } ~~~ 匿名偏函數 ~~~ object CaseDemo1 extends App { // val result = List(1, 2, 3, "heihei", 5).map{case i: Int => i * 2} val result2 = List(1, 2, 3, "heihei", 5).collect{case i: Int => i * 2} println(result2) } ~~~ map不能用,因為map不會檢查每個元素是不是能應用到這個函數上 函數上有類型約束的,map不檢查 collect會檢查 輸出 ~~~ List(2, 4, 6, 10) ~~~ 實現策略 ~~~ object CaseDemo1 extends App { val f1 = new PartialFunction[Any, Int] { //把類型轉為Int,并加1 def apply(any: Any) = any.asInstanceOf[Int] + 1 //檢查類型 def isDefinedAt(any: Any) = if (any.isInstanceOf[Int]) true else false } //collect會調用isDefinedAt,map不會 val result = List(1, 3, 5, "seven") collect f1 println(result) } ~~~ # 守衛 像if表達式一樣,match也提供守衛功能,守衛可以是任何boolean條件 ~~~ val ch = 3 var sign = 0 ch match { case '+' => sign = '+' case '-' => sign = '-' case _ if ch.toString.equals("3") => sign = 3 case _ => sign = -1 } println(sign) ~~~ # 模式中的變量 如果在case關鍵字后面跟變量名,那么match前表達式的值會賦給那個變量 ~~~ def match2() = { for (c <- "+-*/123") { c match { case value if Character.isDigit(c) => println("這是一個數字: " + value) case '+' => println("這次字符為+號") case '-' => println("這次字符為-號") case '*' => println("這次字符為*號") case '/' => println("這次字符為/號") case _ => println("通配") } } } match2() ~~~ # 提取器 模式匹配什么才算匹配呢? 即,case中unapply方法返回some集合則為匹配成功,返回none集合則為匹配失敗. **unapply** 調用unapply,傳入number 接收返回值判斷返回值是None還是Some 如果是Some,則將其解開,并將其中值賦值給n(就是case Square(n)中的n) ~~~ object Square { def unapply(z: Double): Option[Double] = Some(math.sqrt(z)) } object CaseDemo2 extends App { var n = 36.0 n match { case Square(result) => println(s" ${n} + ",s" + ${result}") } } ~~~ 輸出 ~~~ ( 36.0 + , + 6.0) ~~~ # 變量聲明中的模式 match中每一個case都可以單獨提取出來,意思是一樣的 ~~~ val (x, y) = (1, 2) println(x, y) val (q, r) = BigInt(10) /% 3 println(q, r) val arr = Array(1, 7, 2, 9) val Array(first, second, _*) = arr println(first, second) ~~~ 輸出 ~~~ (1,2) (3,1) (1,7) ~~~ # for表達式中的模式 ~~~ import scala.collection.JavaConverters._ for ((k, v) <- System.getProperties.asScala) { println(k + " -> " + v) } ~~~ # 中置表達式 什么是一個中置表達式? 1+2,這就是一個中置表達式. 如果unapply方法產出一個元組,你可以在case語句中使用中置表示法.比如可以匹配一個List序列 ~~~ val list = List(1, 2, 3, 4, 5, 6) list match { case l1 :: l2 :: l3 => println(l1 + " , " + l2 + " , " + l3) } ~~~ 從左到有,多的就變為list 輸出 ~~~ 1 , 2 , List(3, 4, 5, 6) ~~~ # 嵌套類 ~~~ abstract class Item case class Article(description: String, price: Double) extends Item //Item*表示可以多個 case class Bundle(description: String, discount: Double, item: Item*) extends Item object CaseDemo extends App { def match9() = { val sale = Bundle("愚人節大甩賣系列", 10, Article("<<九陰真經>>", 40), Bundle("從出門一條狗到裝備全發光", 20, Article("如何快速撿起地上裝備", 80), Article("名字起的太長", 30))) val result = sale match { case Bundle(_, _, Article(descr, _), _*) => descr } println(result) } match9() } ~~~ 輸出 ~~~ <<九陰真經>> ~~~ 如果要輸出后面可以這樣 ~~~ val result = sale match { case Bundle(_, _, Article(descr, _), temp @ _*) => temp } ~~~ 輸出 ~~~ WrappedArray(Bundle(從出門一條狗到裝備全發光,20.0,WrappedArray(Article(如何快速撿起地上裝備,80.0), Article(名字起的太長,30.0)))) ~~~ 通過@表示法將嵌套的值綁定到變量 `_*`綁定剩余Item到temp
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看