Scala Class etc. 2

Higher-Order Functions

  • def 定義的是方法,而不是函數(shù)
  • 函數(shù)可作為變量存在,可直接調(diào)用,也可作為值傳遞給其他函數(shù)
  • _ 后綴將普通方法變?yōu)楹瘮?shù): ceil _
    • 根據(jù)上下文編譯器可以自動將方法轉(zhuǎn)換為函數(shù),也可省略 _ 后綴
  • 高階函數(shù),接收函數(shù)的函數(shù)
  • 參數(shù)類型推導(dǎo)
    • 匿名函數(shù)傳遞給其他函數(shù)或方法時,如果一直到參數(shù)類型,則可省略匿名函數(shù)的參數(shù)類型,可自動推導(dǎo)類型
    • 參數(shù)只有一個時可省略括號
      • 當(dāng)參數(shù)在右側(cè)只出現(xiàn)一次時,可使用 _ 簡寫
  • 閉包 Closures,特定作用域
  • SAM, single abstract method interface
    • 對應(yīng) Java 中的函數(shù)式接口 (1.8)
    • 可將 Scala 函數(shù)傳遞給 Java,只在函數(shù)字面量中起作用
  • 柯里化 Currying
    • 將接收兩個參數(shù)的函數(shù)變?yōu)榻邮盏谝粋€參數(shù)的函數(shù),該函數(shù)返回一個消費第二個參數(shù)的函數(shù)
  • 控制抽象 Control Abstractions
    • Scala 只包含少量的流程控制語句,用戶可自定義控制語句

Pattern Matching and Case Classes

  • 可對任何類型進行模式匹配,匹配順序從上至下

  • 模式匹配代替 switch,默認(rèn)分支為 case _;可避免 switch 語句中因缺少 break 帶來的 fall-through 問題

  • 模式匹配也是表達(dá)式,可將其返回值直接賦值給變量

  • 模式守衛(wèi) / guards,為匹配設(shè)置條件,任何 Boolean 條件都可作為模式守衛(wèi);case ... if ... => ...

  • case 關(guān)鍵字后接變量名或?qū)?yīng)數(shù)據(jù)結(jié)構(gòu)中使用變量名,那么匹配項就賦值給該變量,變量名必須以小寫字母開頭

  • 使用 | 分隔同一匹配的多個可選項,此時不可使用變量綁定元素

  • 類型匹配,代替 isInstanceOfasInstanceOf,直接進行類型轉(zhuǎn)換

    • 必須為類型指定變量名,否則匹配的是實際的類型對象
    • 匹配在運行時發(fā)生,而 JVM 泛型會被擦除
      • 不可以匹配具體的 Map 類型(可使用 case Map[_, _],不可使用 case Map[Int, Int]
      • Array 的類型不會被擦除
  • 解構(gòu) destructuring

    • 匹配數(shù)組
      case Array(x, y) => s"$x $y"  // 匹配長度為2的數(shù)組,并將分別綁定到 x, y
      case Array(0, rest @ _*) => rest.min // 可變參數(shù)
      
    • 匹配 List
      case x :: y :: Nil => ...  // 綁定參數(shù)
      case head :: tail => ...  // 解構(gòu) head , tail
      
    • 匹配元組
      case (0, _) => ... // 匹配第一個元素為0
      case (x, y) => ... // 綁定參數(shù)
      
  • 定義變量,注意一定要小寫開頭;其實等價于 match 模式匹配加上賦值操作

    • val (x, y) = (1, 2)
    • val Array(f, s, rest @ _*) = arr
  • 用于 for 循環(huán)遍歷集合,匹配符合條件的元素

    for ((k, v) <- System.getProperties()) println(s"$k $v")
    // 匹配 value 為 "" 的項,其他的則被忽略
    for ((k, "") <- System.getProperties()) println(k)
    // if guard 過濾
    for ((k, v) <- System.getProperties() if v == "") println(k)
    
  • Case Class

    • 用于模式匹配的特殊類
    • 構(gòu)造參數(shù)默認(rèn)為 val,默認(rèn)提供 apply、unapplytoString、equals、hashCode、copy
      • copy 用于復(fù)制對象時,可使用命名參數(shù)來修改屬性
    • case class X 使用時 case X() => ...,需要括號
    • case object S 單例,使用時 case S => ..., 不要括號
    • :: 也是 case class,配合中綴表達(dá)式,就是常見的匹配方式,case head :: tail,實際調(diào)用 ::(head, tail)
    • 可用于嵌套的結(jié)構(gòu);綁定變量、可變參數(shù)匹配類似
    • 適用于固定結(jié)構(gòu)的類,如 List
  • sealed 密封的

    • 被修飾的類,則其子類必須和該類在同一個文件中定義
    • 在編譯時即確定了所有匹配項的可能性
  • Option 也是使用 case class 來表示是否有值存在的

    • 子類 Some 封裝值,子類 None 表示無值
    • 相比使用 ""null 更加安全
    • Map 進行 get 操作返回的也是 Option,也可使用模式匹配來處理
    • getOrElse 嘗試獲取值,未獲取到則使用給定的值
  • Partial Function 偏函數(shù)

    • 沒有對所有輸入進行定義的函數(shù)
    • apply 從模式匹配中計算函數(shù)值,isDefinedAt 判斷輸入是否匹配定義的模式
    • case 語句塊是偏函數(shù)
    • PartialFunction[A, B] 的實例, A 為輸入類型,B 為輸出類型
      • 可使用偏函數(shù)的 lift 方法,將偏函數(shù)變?yōu)槌R?guī)函數(shù),返回值為 Option[B]
      • 也可以通過 Function.unlift 將返回 Option[B] 的函數(shù)變?yōu)槠瘮?shù)
    • Seq[A] 也是偏函數(shù) PartialFunction[Int, A]
    • Map[K, V] 也是偏函數(shù) PartialFunction[K, V]
    • catch 語句也是偏函數(shù),可在 catch 塊中使用模式匹配處理異常

注解

  • Scala 中注解可影響代碼編譯,如 @BeanProperty 會自動生成 getter/setter
  • 可用于 類、方法、字段、變量、參數(shù)等
    • 多個注解無順序
    • 主構(gòu)造器的注解,需要加括號 class Credential @Inject() (var username: String, var password: String)
    • 表達(dá)式的注解,使用分號加注解的方式 (map.get(key): @unchecked) ...
    • 類型參數(shù)的注解,class Test[@specialized T]
    • 實際類型的注解,放在類型之后,def name: String @Localized
  • 注解實現(xiàn)
    • 注解必須繼承 Annotation
    • 類型注解必須繼承 TypeAnnotation
    • 元注解 @param, @field, @getter, @setter, @beanGetter, @beanSetter
  • 對應(yīng) Java 修飾符、標(biāo)記接口
    • @volatile 對應(yīng) volatile 關(guān)鍵字
    • @transient 對應(yīng) transient 關(guān)鍵字
    • @strictfp 對應(yīng) strictfp 關(guān)鍵字
    • @native 對應(yīng) native 關(guān)鍵字
    • @cloneable 對應(yīng) Cloneable
    • @remote 對應(yīng) java.rmi.Remote
    • @SerialVersionUID 代替序列化字段
  • 使用 @throws(classOf[Exception]) 來處理 Java 中的受檢異常
  • @varargs 處理可變參數(shù)
    • @varargs def name(args: String*) 生成 void name(String... args)
    • 沒有 @varargs 則可變參數(shù)會被轉(zhuǎn)換成 Seq[T]
  • 優(yōu)化
    • @tailrec 會嘗試優(yōu)化尾遞歸調(diào)用,將其變?yōu)檠h(huán)
    • @switch 編譯器會檢查 match 表達(dá)式是否編譯為 ableswitchlookupswitch,如果被編譯成一系列條件表達(dá)式,則會拋出異常
    • @inline, @noinline 建議編譯器是否將方法替換為行內(nèi)調(diào)用
    • @elidable, 用于標(biāo)注在生產(chǎn)代碼中可移除的方法
      • elidable 對象定義了很多級別常量可直接使用,未指定參數(shù)時默認(rèn)是 SERVERE 即 1000(包含1000)
    • @specialized 處理基礎(chǔ)類型,自動生成基礎(chǔ)類型對應(yīng)包裝類的方法
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容