JDK8學習筆記(一)初識lambda表示式
這幾天又學習了一遍關於jdk8中lambda表示式,以前也看過一遍,由於沒怎麼用過,只是看別人程式碼時用過lambda,也沒有做筆記,時間一長就忘的差不多了。為了吸取教訓,這次看了後,做下筆記,供以後參考學習。
jdk8中加入了兩大技術,一是lambda表示式,二是加入到stream流。
一、基本概念
為了方便學習理解,先了解些基本概念
lambda表示式概念:lambda表示式是 一種匿名函式, lambda表示式有引數列表,函式主體、返回值型別,還可能有異常列表。
個人理解就是,lambda表示式就是比匿名類寫法更簡單的一種寫法,也就是匿名類都可以改成lambda表示式寫法,前提是匿名類必須是函式式介面。lambda表示式就是函式式介面中抽象方法的另一種描述。
lambda表示式格式:(parameters) -> expression 或者 (parameters) -> { statements; }
例子: (Apple a) -> a.getColor();
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());
函式式介面:只定義一個抽象方法的介面。
在jdk8中提供了好多函式式介面,這樣的介面都用一個註解@FunctionalInterface標註
在哪裡可以使用lambda表示式呢?只能在函式式接口出現的地方使用lambda表示式。
二、具體例子
首先,有個函式式介面,程式碼如下:
public interface ApplePredicate{
boolean test (Apple apple);
}
其次,有個篩選蘋果的方法,程式碼如下:
public static List<Apple> filterApples(List<Apple> inventory,
ApplePredicate p){
List<Apple> result = new ArrayList<>();
for(Apple apple: inventory){
if(p.test(apple)){
result.add(apple);
}
}
return result;
}
然後,匿名類是這麼寫的:
List<Apple> redApples = filterApples(inventory, new ApplePredicate() {
public boolean test(Apple apple){
return "red".equals(apple.getColor());
}
});
最後,lambda表示式是比匿名類更簡潔的一種寫法,如下:
List<Apple> redApples =
filterApples(inventory, (Apple apple) -> "red".equals(apple.getColor()));
這個看起來比匿名類的寫法簡潔多了,而且還更加易懂。
注意: filterApples方法的第二個引數是一個函式式介面ApplePredicate,所以這裡可以使用lambda表示式。也就是有函式式介面的地方都可以替換為lambda表示式,在jdk8之前,都是用匿名類的寫法,jdk8開始可以使用lambda表示式替代匿名類,寫法更簡潔易懂了。