本文將探討 JDK 1.8 中引入的新特性 Lambda (λ) 表達式
主要解決以下幾個問題:html
接口的方法默認是public abstract,都是抽象方法,而函數式接口則有且僅有一個抽象方法,但能夠有多個非抽象方法,一般用註解進行標識java
@FunctionalInterface
這裏列舉一些JDK 1.8之前經常使用的函數式接口:編程
在JDK 1.8中新增了以下函數式接口:api
由於Java是面向對象的,方法間參數傳遞須要爲對象,而不能是方法,若想向方法傳遞方法,則須要一個只有一個抽象方法的接口實現類的對象,將這個對象傳到方法中就實現了向方法傳遞方法。
總結:函數式接口即是爲了解決向方法傳遞方法的需求,將須要傳遞的方法轉爲一個函數式接口對象(有且僅有一個抽象方法的接口實現類),以此來解決向方法傳遞方法的需求。數據結構
筆者是這樣認爲的,大部分問題實際是圍繞時間和空間的問題,就像不一樣的數據結構是在作時間和空間上的取捨,是爲了節約更多空間,而犧牲一點時間,或者是爲了節約更多時間,而佔用更多空間。
用相同的思考模式去看編程語言的升級其實也是這樣的,是爲了下降編程難度,使代碼更易懂更易用,這樣就能夠節約更多的時間去作別的,而不是花費過多時間去編碼。
而上面的問題其實也是爲了讓代碼更易懂更易用,至於怎麼體現出更易懂更易用的,讀者能夠獨自思考思考。多線程
Lambda表達式能夠將函數做爲一個方法的參數oracle
這就就比如語法糖,能讓代碼更好寫也更好讀。但筆者也知道,任何新的東西引入必然帶來新的混亂,學習新的知識須要過程,適應也須要過程,但其最終的回報筆者認爲是值得的。編程語言
// 方式1、函數式接口 @FunctionalInterface interface ILike { // 接口中的訪問修飾符、abstract修飾符是能夠省略的 // 由於接口中默認就是抽象方法,又由於接口是須要實現類來實現其中方法的 // 因此訪問修飾符默認是public void lambda(); } // 方式1、實現函數式接口中的抽象方法 class Like implements ILike { @Override public void lambda() { System.out.println("Lambda 1"); } } public class TestLambda { // 方式二:靜態內部類 static class Like1 implements ILike { @Override public void lambda() { System.out.println("Lambda 2"); } } public static void main(String[] args) { // 方式一:函數式接口 ILike like = new Like(); like.lambda(); // 方式二:靜態內部類 like = new Like1(); like.lambda(); // 方式三:局部內部類 class Like2 implements ILike { @Override public void lambda() { System.out.println("Lamdba 3"); } } like = new Like2(); like.lambda(); // 方式四:匿名內部類,沒有類的名稱,必須藉助接口或父類 like = new ILike() { @Override public void lambda() { System.out.println("Lamdba 4"); } }; like.lambda(); // 方式五:Lamdba表達式,只保留具體的方法 // 前提是必須爲函數式接口 like = () -> { System.out.println("Lambda 5"); }; like.lambda(); } }
如有不足,敬請指正
虛心若愚,求知若渴ide