目錄
什麼是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
這樣不僅代碼短,而且更直觀,更易閱讀。
剛接觸這種寫法可能會不太習慣,但是熟能生巧,用的多了,就習慣了。
學習的痛苦是暫時的,不學習的痛苦是終生的,好好想想就懂了,你懂得?