一畜伐、Lambda優(yōu)化以下問題
1.解決原有匿名內(nèi)部類語法冗余問題
2.解決作用域指向不明確問題
3.解決多余代碼產(chǎn)生的“高度”問題
二聚请、函數(shù)式接口
?1.Java API中有的接口只有一個方法,大多數(shù)回調(diào)接口都擁此個特征:比如Runnable接口和Comparator接口雀鹃。因此只擁有一個方法的接口稱為函數(shù)式接口;
?2.lambda為了使匿名接口不在產(chǎn)生冗余代碼,使用“箭頭”結(jié)構(gòu)表示匿名接口(以下會有示例)腹泌,同時JAVA SE 8中新增java.util.function包提供了常用的函數(shù)式接口:
????? Predicate——接收T對象并返回boolean
????? Consumer——接收T對象,不返回值
????? Function——接收T對象尔觉,返回R對象
????? Supplier——提供T對象(例如工廠)凉袱,不接收值
????? UnaryOperator——接收T對象,返回T對象
????? BinaryOperator——接收兩個T對象侦铜,返回T對象
三专甩、使用和特性
1.語法:lambda 表達(dá)式的語法由 【(參數(shù)列表)箭頭符號-> {函數(shù)體};】組成钉稍,例:(String s) -> { System.out.println(s); }
2.函數(shù)式接口的類型自動推導(dǎo):
?lambda可自動推導(dǎo)目標(biāo)類型
例:JavaSE7中的對象:
JavaSE8 lambda簡化后:
????????*同樣的函數(shù)體涤躲,但表示了不同的類型;第一個lambda表達(dá)式【() -> "done"】是Callable的實例贡未,而第二個lambda表????達(dá)式【() -> "done"】則是PrivilegedAction的實例种樱。
3.當(dāng)函數(shù)體有返回值時,可省略“return”關(guān)鍵字俊卤,省略”嫩挤;”分號
????例1:接收一個參數(shù)(y),返回其2倍的值?
????????( y ) -> 2 * y
? ?例2:? 一個接收String和Object并返回int的函數(shù)類型可以被表示為
????? (String,Object) -> int
4.簡化過程
????*當(dāng)只有一個參數(shù)時,可省略類型
????*當(dāng)只有一行代碼語句時可省略分號和 { },多行語句時不可省略
????*當(dāng)只有一個返回值時可省略return
????????????(String x)->{ System.out.print( x ); }?
????????????????可簡化為:(x)-> System.out.print( x )
?5. 詞法作用域
????? ? *在lambda函數(shù)體中消恍,“this”會指向外部岂昭,且不會繼承超類的變量。
?6. lambda 表達(dá)式對 值 封閉狠怨,對 變量 開放:
?
四约啊、JDK1.8其它相關(guān)
1.lambda集合遍歷:
????? *List集合:
????? list.forEach(c->System.out.println(c));
????? *map集合
????? map.forEach((key,value)->System.out.println("key:" + key + " value:" + value));
2.方法引用
??Java SE8
????????提供的方法引用有很多種邑遏,需要在類名或?qū)ο笈c方法之間加入雙冒號“::“表示,它們的語法如下:
????????靜態(tài)方法引用:ClassName::methodName
????????實例上的實例方法引用:instanceReference::methodName
????????超類上的實例方法引用:super::methodName
????????類型上的實例方法引用:ClassName::methodName
????????構(gòu)造方法引用:Class::new
????????數(shù)組構(gòu)造方法引用:TypeName[]::new