書到用時方恨少,由于前幾日在對接公司的一個項目中,發現該項目用到了很多jdk8的新特性,代碼非常的簡潔,但是卻由于對jdk8的新特性了解甚少,以緻很多代碼邏輯都看不懂,是以花了些時間學習了jdk8比較重要的幾個新特性,并在此進行總結!
Lambda表達式
在java集合中,通過forEach方法周遊集合就用到了jdk1.8的新特性:Lambda表達式與函數式接口
先看forEach方法的源碼:
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
由方法源碼可知,forEach方法是Iterable接口(java.lang)中的一個預設方法,該方法接收一個函數式接口Consumer作為參數,Consumer接口是四大函數式接口之一,屬于消費型接口,何為消費型,該接口的唯一抽象方法是
void accept(T t);
方法接收一個參數,但是沒有傳回值,也就是簡單的了解成把這個參數給消費了,該方法多用于接收一個參數之後,使用輸出語句輸出該參數的值;該方法的處理邏輯就是将集合中的每一個元素都使用了Consumer接口的accept方法處理邏輯。
//1.匿名内部類的寫法
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Consumer<Integer> consumer=new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
System.out.println(integer);
}
};
list.forEach(consumer);
2.匿名内部類的寫法
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.forEach(new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
System.out.println(integer);
}
});
3.jdk1.8 Lambda表達式的寫法
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.forEach((Integer v)-> {System.out.println(v);});
對于Lambda表達式,還可以進一步簡化書寫,如果方法體隻有一行語句,那麼可以省略語句之後的分号以及省略方法體的大括号,如果這行語句是以return傳回的,還可以直接省略return。需要注意的是:一般要省略就一起省略,也就是分号、大括号、return三者一起省略;對于參數,可以省略參數的類型,另外,如果是隻有一個參數,還可以省略參數的括号。
對于上面的Lambda表達式,簡化寫法如下:
四大函數式接口
函數式接口指的是接口中隻包含一個抽象方法,預設方法和靜态方法數量不限的接口;jdk1.8以後,還新增了@FunctionalInterface注解來标注函數式接口;所有函數式接口都位于java.util.function包下。
- Function:功能型函數式接口,
該方法接收一個參數,并傳回一個值;示例:R apply(T t);
- Consumer:消費型函數式接口,
該方法接收一個參數,不做任何傳回void accept(T t);
- Predicate:斷言型函數式接口,
該抽象方法接收一個參數,并傳回一個布爾值boolean test(T t);
- Supplier:供給型函數式接口,
該方法不接收任何參數,但是會傳回一個值T get();
關于jdk1.8的其它新特性:
- jdk1.8新特性——Optional類:https://blog.csdn.net/can_chen/article/details/106886579
- jdk1.8新特性——Stream流式程式設計:https://blog.csdn.net/can_chen/article/details/106886484
- jdk1.8新特性——方法引用:https://blog.csdn.net/can_chen/article/details/106886536