[Java基礎] Java8新特性
一:函數語言程式設計
lambda表示式:
Runnable run = () -> { //邏輯程式碼 };
歸根結底,lambda表示式就是一個類似於匿名內部類的語法糖,只不過不會像匿名內部類一樣製造一個新的記憶體空間;這個表示式一般是用於函數語言程式設計的,把方法當作引數,傳給另一方法,主要關注點在引數列表和返回值裡,
所以產生了一下幾種用法:
1. () -> {}; 當此方法無引數時使用
2.x -> {}; 當此方法有一個引數時使用
3.(x1,x2,x3) -> {}; 當此方法有多個引數時使用
Java開發人員認為如果就這樣使用lambda太過浪費了,於是產生了四大函數語言程式設計介面(只有一個方法的介面):
1.Consumer<T> : void accept(T t); 消費型函式介面,引數列表為傳入一泛型,無返回值.
2.Supplier<T>: T get(); 供給型函式介面,引數列表為空,返回值為一泛型;
3.Function<T,R>: R apply(T t),操作型函式介面,引數列表為一泛型,返回值為另一泛型;
4.Predicate<T>: boolean test<T t>,斷言型函介面,引數列表為一泛型,返回值為布林值;
總的來說,使用lambda表示式要對函式式的返回值和引數列表要有充分的瞭解,以及什麼時候能用
方法的引用:
類::靜態方法
類::例項方法
類::new
物件::例項方法
引用也是另一形態的語法糖,進行了方法的另一種呼叫,可以呼叫靜態方法和例項方法和構造方法
二:Stream
Stream 為Java8新加入的API 為一些集合操作提供了更大的便利
操作型別分為 Intermediate / Terminal / Short-circuiting
i.惰化操作,將一堆資料進行某種程度上的資料過濾或者對映然後賦給一個新的流,主要目的是開啟流,一個流後面可以跟0-n個惰化操作
ii.真正的使用流的操作,可以認為在一個流進行了Terminal後,這段流才真正的開始被遍歷,然後這段流就結束了被使用光了,無法再被操作,所以Terminal一般都放在對流操作的最後一步操作
iii.對一個Intermediate完成後的類,進行限制,如limit() 把這個流截斷,用於把一個太長的流進行限制,或者對一個在進行Terminal操作的流限制它操作的時間
流的使用: 簡單來說就是進行 filter-map-reduce 操作後 製造出一個結果或者副作用(side effect)
1.流的建立:
Stream.of()
集合.stream()
Stream.iterator()
Stream.generate()
2.流的中間操作:
filter()
boxed()
limit()
sorted()
distinct()
3.流的終止操作:
collect()