Higher-Order Functions
-
def定義的是方法,而不是函數(shù) - 函數(shù)可作為變量存在,可直接調(diào)用,也可作為值傳遞給其他函數(shù)
-
_后綴將普通方法變?yōu)楹瘮?shù):ceil _- 根據(jù)上下文編譯器可以自動將方法轉(zhuǎn)換為函數(shù),也可省略
_后綴
- 根據(jù)上下文編譯器可以自動將方法轉(zhuǎn)換為函數(shù),也可省略
- 高階函數(shù),接收函數(shù)的函數(shù)
- 參數(shù)類型推導(dǎo)
- 匿名函數(shù)傳遞給其他函數(shù)或方法時,如果一直到參數(shù)類型,則可省略匿名函數(shù)的參數(shù)類型,可自動推導(dǎo)類型
- 參數(shù)只有一個時可省略括號
- 當(dāng)參數(shù)在右側(cè)只出現(xiàn)一次時,可使用
_簡寫
- 當(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)中使用變量名,那么匹配項就賦值給該變量,變量名必須以小寫字母開頭使用
|分隔同一匹配的多個可選項,此時不可使用變量綁定元素-
類型匹配,代替
isInstanceOf和asInstanceOf,直接進行類型轉(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ù) - 匹配
Listcase x :: y :: Nil => ... // 綁定參數(shù) case head :: tail => ... // 解構(gòu) head , tail - 匹配元組
case (0, _) => ... // 匹配第一個元素為0 case (x, y) => ... // 綁定參數(shù)
- 匹配數(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、unapply、toString、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ù)
- 可使用偏函數(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á)式是否編譯為ableswitch或lookupswitch,如果被編譯成一系列條件表達(dá)式,則會拋出異常 -
@inline,@noinline建議編譯器是否將方法替換為行內(nèi)調(diào)用 -
@elidable, 用于標(biāo)注在生產(chǎn)代碼中可移除的方法-
elidable對象定義了很多級別常量可直接使用,未指定參數(shù)時默認(rèn)是SERVERE即 1000(包含1000)
-
-
@specialized處理基礎(chǔ)類型,自動生成基礎(chǔ)類型對應(yīng)包裝類的方法
-