Lambda表達(dá)式可以理解為一種匿名函數(shù);沒有名稱藏斩,有參數(shù)列表、函數(shù)主題却盘、返回類型狰域,可能還有一個可以拋出的異常列表
Lambda表達(dá)式3個部分:參數(shù)列表;箭頭黄橘;主體
在哪里使用:在函數(shù)式接口上使用
函數(shù)式接口:接口只定義了一個抽象方法兆览;
Lambda表達(dá)式允許直接以內(nèi)聯(lián)的形式作為函數(shù)式接口的抽象方法的提供,并把整個表達(dá)式作為接口的實例
@FunctionalInterface 表示該接口會設(shè)計成一個函數(shù)式接口
Lambda表達(dá)式使用步驟:1.行為參數(shù)化 2.使用函數(shù)式接口來傳遞行為 3.執(zhí)行一個行為 4.傳遞Lambda
常用函數(shù)式接口:
Predicate ? ?函數(shù)描述符 T -> boolean ? ?boolean?test(T t)?
Consumer ? T -> void ? ? ? ? ?void accept(T t)
Function ? T,R -> R ? ? R apply(T t)
Supplier ?() -> T ? T get()?
Callable ?() -> T ?T call()
BiFunction R apply(T,U)
還有為原始類型設(shè)計的對應(yīng)接口可以避免裝箱塞关。輸入?yún)?shù)類型的函數(shù)式接口的名稱要加上對應(yīng)的原始類型前綴如:IntPredicate等
類型推斷:
Lambda表達(dá)式的類型是從使用Lambda的上下文推斷出來的抬探;Lambda表達(dá)式需要的類型稱為目標(biāo)類型
如果一個Lambda的主題是一個語句表達(dá)式,它就和一個返回void的函數(shù)描述符兼容
使用局部變量:
局部變量必須顯示聲明為final
閉包就是一個函數(shù)的實例帆赢,且它可以無限制地訪問那個函數(shù)的非本地變量
方法引用:
根據(jù)已經(jīng)有的方法創(chuàng)建Lambda表達(dá)式
目標(biāo)引用在::前小压,方法名稱在后
如何構(gòu)建方法引用:1.指向靜態(tài)方法的方法引用(如:Integer :: parseInt)2.指向任意類型實例方法(String :: length)
3.指向現(xiàn)有對象的實例方法
方法引用是否有效:方法引用的簽名必須和上下文類型匹配
構(gòu)造函數(shù)引用:
ClassName::new
復(fù)合Lambda表達(dá)式的有用方法:
1.比較器復(fù)合:逆序;比較器鏈
2.謂詞復(fù)合:謂詞接口包括3個方法:negate椰于;and怠益; or
3.函數(shù)復(fù)合:Function接口代表的Lambda表達(dá)式復(fù)合起來; andThen; compose 都返回一個Function實例