JDK1.8 新特性之Lambda表達式

目錄

什麼是Lambda表達式

Lambda常見寫法示例。

爲什麼要引入Lambda 表達式

什麼是函數式接口

自定義一個函數式接口

方法引用


什麼是Lambda表達式

Java 8 最大的變化就是引入了Lambda表達式———一種緊湊的、傳遞行爲的方式。

Lambda表達式本質上是一段匿名內部類,也可以是一段可以傳遞的代碼。

可以將Lambda表達式理解爲一個匿名函數; Lambda表達式允許將一個函數作爲另外一個函數的參數; 我們可以把 Lambda 表達式理解爲是一段可以傳遞的代碼(將代碼作爲實參),也可以理解爲函數式編程,將一個函數作爲參數進行傳遞。

Lambda常見寫法示例。

(a,b)->{return a+b;}
(int a,int b)->{return a+b;}
()->System.out.println("Hello World!");
(String str)->{System.out.println(str);}
new Thread(() -> System.out.println("--->" + "aaa")).start();  //開啓一個線程

爲什麼要引入Lambda 表達式

Lambda表達式能夠讓程序員的編程更加高效

比如我們平常要創建一個線程,常規操作如下:

public static void main(String[] args) {
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("Hello World!");
        }
    });
   thread.start();
}

改寫爲Lambda表達式寫法:

 public static void main(String[] args) {
     new Thread(() -> System.out.println("Hello World!")).start();
 }

Lambda表達式能夠讓程序員的編程更加高效沒毛病吧,看看多省時省力省心啊。

什麼是函數式接口

即SAM(Single Abstract Method )接口,有且只有一個抽象方法的接口,用作Lambda表達式的類型。

JDK1.8之後,添加@FunctionalInterface表示這個接口是是一個函數式接口

只有函數式接口的變量或者是函數式接口,才能夠賦值爲Lambda表達式。這個接口中,可以有默認方法,或者是靜態方法。函數式接口中還可以有Object中覆蓋的方法,也就是equals方法,hashCode方法。 JDK1.8之後,如果是函數式接口,可以添加 @FunctionalInterface表示這是一個函數式接口

如Runnable(源碼)

@FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}

自定義一個函數式接口

@FunctionalInterface
public interface IHelloInterface {
    void hello();
}


public static void main(String[] args) {
    IHelloInterface iHelloInterface = () -> System.out.println("I like study");
    iHelloInterface.hello();
}

方法引用

Lambda表達式有一個常見的用法:Lambda表達式經常調用參數。比如獲取學生的姓名,如

student->student.getName()

這種用法很普遍,因此Java 8爲其提供了一個簡寫語法,叫做方法引用,用方法引用重新上面的Lambda表達式,代碼如下:

Student::getName

其標準語法爲ClassName::methodName。

注意:雖然是調用方法,但不需要在後面加括號。凡是使用Lambda表達式的地方,就可以使用方法引用。

構造函數也有其縮寫方式。如果你需要創建一個Student對象,一般會這麼寫:

(name)->new Student(name)

同樣使用方法引用,可以這樣寫:

Student::new

這樣不僅代碼短,而且更直觀,更易閱讀。

剛接觸這種寫法可能會不太習慣,但是熟能生巧,用的多了,就習慣了。

學習的痛苦是暫時的,不學習的痛苦是終生的,好好想想就懂了,你懂得?

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章