1. 程式人生 > >JDK8學習筆記(一)初識lambda表示式

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表示式替代匿名類,寫法更簡潔易懂了。