Higher-Order Functions
def定義的是方法,而不是函式- 函式可作為變數存在,可直接呼叫,也可作為值傳遞給其他函式
_后綴將普通方法變為函式:ceil _- 根據背景關系編譯器可以自動將方法轉換為函式,也可省略
_后綴
- 根據背景關系編譯器可以自動將方法轉換為函式,也可省略
- 高階函式,接收函式的函式
- 引數型別推導
- 匿名函式傳遞給其他函式或方法時,如果一直到引數型別,則可省略匿名函式的引數型別,可自動推導型別
- 引數只有一個時可省略括號
- 當引數在右側只出現一次時,可使用
_簡寫
- 當引數在右側只出現一次時,可使用
- 閉包 Closures,特定作用域
- SAM, single abstract method interface
- 對應 Java 中的函式式介面 (1.8)
- 可將 Scala 函式傳遞給 Java,只在函式字面量中起作用
- 柯里化 Currying
- 將接收兩個引數的函式變為接收第一個引數的函式,該函式回傳一個消費第二個引數的函式
- 控制抽象 Control Abstractions
- Scala 只包含少量的流程控制陳述句,用戶可自定義控制陳述句
Pattern Matching and Case Classes
-
可對任何型別進行模式匹配,匹配順序從上至下
-
模式匹配代替
switch,默認分支為case _;可避免switch陳述句中因缺少break帶來的fall-through問題 -
模式匹配也是運算式,可將其回傳值直接賦值給變數
-
模式守衛 / guards,為匹配設定條件,任何
Boolean條件都可作為模式守衛;case ... if ... => ... -
case關鍵字后接變數名或對應資料結構中使用變數名,那么匹配項就賦值給該變數,變數名必須以小寫字母開頭 -
使用
|分隔同一匹配的多個可選項,此時不可使用變數系結元素 -
型別匹配,代替
isInstanceOf和asInstanceOf,直接進行型別轉換- 必須為型別指定變數名,否則匹配的是實際的型別物件
- 匹配在運行時發生,而 JVM 泛型會被擦除
- 不可以匹配具體的
Map型別(可使用case Map[_, _],不可使用case Map[Int, Int]) Array的型別不會被擦除
- 不可以匹配具體的
-
解構 destructuring
- 匹配陣列
case Array(x, y) => s"$x $y" // 匹配長度為2的陣列,并將分別系結到 x, y case Array(0, rest @ _*) => rest.min // 可變引數 - 匹配
Listcase x :: y :: Nil => ... // 系結引數 case head :: tail => ... // 解構 head , tail - 匹配元組
case (0, _) => ... // 匹配第一個元素為0 case (x, y) => ... // 系結引數
- 匹配陣列
-
定義變數,注意一定要小寫開頭;其實等價于
match模式匹配加上賦值操作val (x, y) = (1, 2)val Array(f, s, rest @ _*) = arr
-
用于
for回圈遍歷集合,匹配符合條件的元素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
- 用于模式匹配的特殊類
- 構造引數默認為
val,默認提供apply、unapply、toString、equals、hashCode、copycopy用于復制物件時,可使用命名引數來修改屬性
case class X使用時case X() => ...,需要括號case object S單例,使用時case S => ..., 不要括號::也是 case class,配合中綴運算式,就是常見的匹配方式,case head :: tail,實際呼叫::(head, tail)- 可用于嵌套的結構;系結變數、可變引數匹配類似
- 適用于固定結構的類,如
List等
-
sealed密封的- 被修飾的類,則其子類必須和該類在同一個檔案中定義
- 在編譯時即確定了所有匹配項的可能性
-
Option也是使用 case class 來表示是否有值存在的- 子類
Some封裝值,子類None表示無值 - 相比使用
""或null更加安全 Map進行get操作回傳的也是Option,也可使用模式匹配來處理getOrElse嘗試獲取值,未獲取到則使用給定的值
- 子類
-
Partial Function 偏函式
- 沒有對所有輸入進行定義的函式
apply從模式匹配中計算函式值,isDefinedAt判斷輸入是否匹配定義的模式case陳述句塊是偏函式PartialFunction[A, B]的實體,A為輸入型別,B為輸出型別- 可使用偏函式的
lift方法,將偏函式變為常規函式,回傳值為Option[B] - 也可以通過
Function.unlift將回傳Option[B]的函式變為偏函式
- 可使用偏函式的
Seq[A]也是偏函式PartialFunction[Int, A]Map[K, V]也是偏函式PartialFunction[K, V]catch陳述句也是偏函式,可在catch塊中使用模式匹配處理例外
注解
- Scala 中注解可影響代碼編譯,如
@BeanProperty會自動生成getter/setter - 可用于 類、方法、欄位、變數、引數等
- 多個注解無順序
- 主構造器的注解,需要加括號
class Credential @Inject() (var username: String, var password: String) - 運算式的注解,使用分號加注解的方式
(map.get(key): @unchecked) ... - 型別引數的注解,
class Test[@specialized T] - 實際型別的注解,放在型別之后,
def name: String @Localized
- 注解實作
- 注解必須繼承
Annotation - 型別注解必須繼承
TypeAnnotation - 元注解
@param,@field,@getter,@setter,@beanGetter,@beanSetter
- 注解必須繼承
- 對應 Java 修飾符、標記介面
@volatile對應volatile關鍵字@transient對應transient關鍵字@strictfp對應strictfp關鍵字@native對應native關鍵字@cloneable對應Cloneable@remote對應java.rmi.Remote@SerialVersionUID代替序列化欄位
- 使用
@throws(classOf[Exception])來處理 Java 中的受檢例外 @varargs處理可變引數@varargs def name(args: String*)生成void name(String... args)- 沒有
@varargs則可變引數會被轉換成Seq[T]
- 優化
@tailrec會嘗試優化尾遞回呼叫,將其變為回圈@switch編譯器會檢查match運算式是否編譯為ableswitch或lookupswitch,如果被編譯成一系列條件運算式,則會拋出例外@inline,@noinline建議編譯器是否將方法替換為行內呼叫@elidable, 用于標注在生產代碼中可移除的方法elidable物件定義了很多級別常量可直接使用,未指定引數時默認是SERVERE即 1000(包含1000)
@specialized處理基礎型別,自動生成基礎型別對應包裝類的方法
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/1980.html
標籤:Scala
上一篇:Scala Class etc.
