1. 程式人生 > >Scala教程(十一)Curry詳解與模式匹配

Scala教程(十一)Curry詳解與模式匹配


Scala教程(十一)Curry詳解與模式匹配


1 curry函式

1.1 curry化的函式

   curry化的函式被應用了多個引數列表,而不是僅僅一個。

      // 傳統函式
      def curringSumOld(x:Int,y:Int) = x * y;
      
      // curring化的函式被應用了多個引數列表
      def curringSum(x:Int)(y:Int) = x + y;
      println(curringSum(10)(15));

輸出結果: 25

1.2 curry佔位符

用偏應用函式表示式方式,把佔位符標註用在

curriedSum裡。

      // 用偏應用函式表示式方式,把佔位符標註用在curriedSum裡
      val onePlus = curringSum(1)_
      println(onePlus(12));
輸出結果: 13

1.3 curry對比

    // 陣列對比
    val a = Array("hello","scala");
    val b = Array("HELLO","SCALA");
    
    // 忽略大小寫對比
    println(a.corresponds(b)(_.equalsIgnoreCase(_)));
輸出結果: true

2 模式匹配case class

2.1 match表示式

    // 正則匹配
    val pattern = "([0-9]+) ([a-z]+)".r;
    "741258933 hadoop" match {
      case pattern(num,item) => println(num+":"+item) 
    } 

輸出結果:741258933:hadoop

2.2 陣列匹配

    def match_array(arr:Any) =  arr match{
      case Array(0) => println("Array:0" )
      case Array(x,y) => println("Array:x="+x+",y="+y )
      case Array(0,_*) => println("Array:..." )
      case _ => println("something else" )
    }
    match_array(Array(0))
    match_array(Array(0,1))
    match_array(Array(0,1,2,3,4,5))
    match_array(Array("one","two","three")) 

輸出結果:

        Array:0

        Array:x=0,y=1

        Array:...

        somethingelse

2.3 case class匹配

   Scalacase class使得對物件進行模式匹配變得非常方便,簡單的來說,Scalacase class就是在普通的類定義前加case這個關鍵字,然後你可以對這些類來模式匹配。

    abstract class Person
    case class Student(age:Int) extends Person
    case class Worker(age:Int,salary:Double) extends Person
    case object Shared extends Person
    
    
    /**
     * 1、宣告case class 每個成員都會預設生成val,如age:Int
     * 2、每個case class  都會有伴生物件,每個伴生物件都會有自己case class的具體物件
     * 3、模式匹配的時候,可以從case class提取內容,提取方法從apply中。
     */
    object case_class_object {
        def main(args: Array[String]): Unit = {
          
            def caseOps(person:Person) = person match{
              case Student(age) => println("I am " + age + " years old");
              case Worker(_,salary) => println("Wow,I got "+salary)
              case Shared => println("no property...");
            }
            
            caseOps(Student(19))
            caseOps(Worker(19,4000))
            caseOps(Shared)
            
            val worker = Worker(29,3000);
            val worker2 = worker.copy(salary = 5000);
            val worker3 = worker.copy(age = 31);
        }
    }

輸出結果:

        Iam 19 years old

        Wow,Igot 4000.0

        noproperty...

2.4 巢狀匹配

abstract class Item
case class Book(description: String, price: Double) extends Item
case class Bundle(description: String, price: Double, items: Item*) extends Item

object pattern_match_case_class_nested {
  def main(args: Array[String]): Unit = {

    def case_class_nested(person: Item) = person match {
      // 匹配Bundle型別,巢狀Book型別,Item型別可以0到N個引數
      case Bundle(_, _, art @ Book(_, _), rest @ _*) => println(art.description + " : " + art.price)
      case Bundle(_, _, Book(descr, _), _*) => println("The first description is : " + descr)
      case _ => println("Oops!!!")
    }

    // 輸出結果:Scala for the Spark Developer : 69.95
    case_class_nested(Bundle("1111 Special's", 30.0,
      Book("Scala for the Spark Developer", 69.95),
      Book("Hadoop in Action", 69.95),
      Book("Hive", 79.95),
      Book("HBase", 32.86)))
  }
}

輸出結果:Scala forthe Spark Developer : 69.95

2.5 Option匹配

   Options語法:sealed關鍵字表示:封閉的、密封的、

   sealed約束:

其修飾的traitclass只能在當前檔案裡面被繼承。

     scala編譯器在檢查模式匹配的時候, scala就能夠在編譯時進行檢查是否所有的選項已經列在case中,減少程式設計的錯誤。

sealed abstract classOption[+A] extends Product withSerializable {

Options有兩個字類,分別讓車SomeNone


    Some中如果有具體的值,則用Some表示。反之,則用None表示。

程式碼示例

    def main(args: Array[String]): Unit = {
        // 宣告陣列
  		  val scores = Map("Alice" -> 99 , "Spark" -> 100)
            // 模式匹配
  				  scores.get("Alice") match {
    			  // Option子類Some,有具體的值,則之輸出。
  				  case Some(score) => println(score)
  				  case None => println("No score")
  		  }
    }

輸出結果:99

    --以上為Curry詳解與模式匹配內容,謝謝大家對我的關注。

                                                                                                                                                                                      ——厚積薄發(yuanxw)