一、初步瞭解lamdba表達式
在jdk8之前我們方法參數都是基本數據類型或者引用數據類型,但是在8方法中可以傳遞函數表達式,即lamdba表達式,此表達式偉大在於既能兼容面向對象的調用也可以使用函數式編程,這是一個質的改變。傳遞值變成傳遞行爲,這也是面向對象和函數式編程的區別。
1.表達式的使用
(type a,type b)->{需要執行的語句;}
一個type可以省略括號,多個type或者無參需要加括號,執行語句的只有一句則可以省略括號和;,省略後的爲函數表達式。
2.@FunctionalInterface
這個叫“函數式接口”,看一下源碼介紹
* Conceptually, a functional interface has exactly one abstract
* method. Since {@linkplain java.lang.reflect.Method#isDefault()
* default methods} have an implementation, they are not abstract. If
* an interface declares an abstract method overriding one of the
* public methods of {@code java.lang.Object}, that also does
* <em>not</em> count toward the interface's abstract method count
* since any implementation of the interface will have an
* implementation from {@code java.lang.Object} or elsewhere.
1.首先是個接口
2.只有一個抽象方法,如果實現了Object的方法,他的抽象方法不會加一。親測確實這樣
這樣的類基本位於java.util.function包
3.Consumer
這是一個典型的函數式接口,他有兩個方法
接口中也有實現方法,我們稱他爲默認方法。還有一個傳入一個泛型T沒有返回值的抽象方法。
爲什麼使用默認方法?
爲了更好的向下兼容,比如老版本實現了list接口,你在接口中加入方法,會導致方法報錯,需要手動去實現,而在接口中自己實現這個方法變成默認的方法就不需要要去改變之前的實現。
4.functon<T,R>
...
5.predicate
...
6.supplier
...
佛系作者,寫哪算哪。
……
7.聊一下方法引用 method reference
爲什麼用方法引用?
lamdba表達式只有一行可以被替換的時候
1.類名::靜態方法名
在類中有靜態方法直接可以類名::靜態方法名調用
2.引用名(對象名)::實例方法名
3.類名::實例方法名
一般調用實例方法都是對象.實例方法,在這裏以第一個參數爲對象去調用實例方法,其餘的都爲參數的形式進入方法
4.構造方法引用 類名::new
調用構造方法
二、stream介紹使用
爲什麼會有這個出現?
爲了更好的操作集合,以一種函數式編程的方式去解決集合問題,這個流的出現和lamdba相輔相成的。
1.流構成的三部分
1.源
stream
- 0-多箇中間操作
xxx,yyy的操作稱爲中間操作
3.終止操作
.count()成爲終止操作
2.流操作的分類
1.惰性求值
如果,沒有count呢莫該代碼不執行
2.及早求值
需要立刻求出該操作的結果
stream.xxx.yyy.zzz().count()
3.報錯問題
java.lang.IllegalStateException: stream has already been operated upon or closed
每一個流只能被處理一次,處理完成流會被關閉。鏈式中沒操作一次都會創建新的流。