從委託到 lambda 表示式介紹(為什麼需要 lambda 表示式)
阿新 • • 發佈:2019-02-09
接下來,筆者將以簡單的說話方式向你介紹java8的新特性,lambda表示式。
用最簡單的方式告訴你為什麼需要 lambda 表示式
簡單地來解釋委託,就是“把方法作為引數傳遞”。
歷史來源:
有時候需要傳入一段程式碼到程式的方法中。
如:
public class MainClass(){
public static final void test(){
if(true){
//執行一段經常修改的程式碼
//王奶奶去了劉奶奶家送牛奶
//……
//王奶奶回家
}else if{
//什麼都不執行
}
}
}
出於某種原因,if 中的程式碼必須頻繁修改。
這個時候就需要把方法寫在物件的方法中,然後把物件傳入到程式中呼叫對應的方法。(重構)
public class MainClass(){
public static final void test(MilkSender c){
if(true){
c.sendMilk();
}else if{
//什麼都不執行
}
}
}
public class MilkSender (){
public void sendMilk(){
//執行一段經常修改的程式碼
//王奶奶去了劉奶奶家送牛奶
//……
//王奶奶回家
}
}
MainClass.test(new MilkSender());
這個時候我們不需要硬編碼地修改 test 中的程式碼,就可以達到 “在方法中執行自定義編碼” 的效果。
不過現在,我們只需要MyClass物件中的一個方法而已,把整個MyClass物件都傳進去,顯得有些亂,
有沒有什麼方法能讓我們只傳入一個方法呢?
答案是有的:傳入一個介面即可。
public static final void test(MyClassInterface c){
if(true){
c.doSomething();
}
}
public interface MyClassInterface (){
public void doSomething();
}
這種形式的編碼我們暫時稱為方法委託。(因為這種叫法來源於C/C++)
這樣做以後,每次都可以直接建立“匿名物件”
MainClass.test(new MyClass(){
@Override
public void doSomething(){
System.out.println("good1");
}
);
MainClass.test(new MyClass(){
@Override
public void doSomething(){
System.out.println("good2");
}
);
這種形式的編碼,我們稱為匿名物件編碼。
嗯,稍微好看點了,但是看起來還是很不舒服:
有時候只是需要一句程式碼,卻寫了至少5行的程式碼。(帶來了可讀性與“高度”問題)
所以為了解決“高度問題”,我們引入lambda表示式。
public void main(String[] args){
DamnedDesigner.test(()->System.out.println("good1"));
DamnedDesigner.test(()->System.out.println("good2"));
}
原來冗長的程式碼一下子變得清晰、簡潔、快速。
lambda表示式不僅僅用於Java,也應用於C#、C++等常用程式語言。
lambda表示式是java8最大的亮點。(咳咳,雖然落後了十年左右才開始)。
java8在國內雖然普及率相當低,但是筆者相信這將無法避免地成為未來的趨勢。
你已經瞭解到:方法委託是啥,匿名物件是啥,lambda表示式是啥。
(你問我lambda表示式實用嗎,那就厲害了!)
lambda表示式具體介紹請看下篇。