天天看點

教你利用Lambda将代碼化繁為簡 | 帶你學《Java面向對象程式設計》之八十六

上一篇:看我72變-多變的内部類 | 帶你學《Java面向對象程式設計》之八十五

【本節目标】

通過閱讀本節内容,你将了解到使用Lambda表達式可以簡化滿足SAM要求的代碼實作,并初步學會Lambda表達式的使用方法。

Lambda表達式

從JDK1.8開始為了簡化使用者進行代碼的開發,專門提供有Lambda表達式的支援,利用此操作形式可以實作函數式的程式設計。對于函數式程式設計比較著名的語言:haskell、Scala,利用函數式程式設計可以避免掉面向對象程式設計之中的一些繁瑣的處理問題。

面向對象在其長期發展的過程之中一直有一部分的反對者,這些反對者認為面向對象的設計過于複雜,過于繁瑣了。以一個最簡單的程式為例。

範例:觀察傳統開發中的問題

interface IMessage{
    public void send(String str);
}
public class JavaDemo{
    public static void main(String[] args) {
        IMessage msg = new IMessage(){
            public void send(String str) {
                System.out.println("消息發送:"+ str);  //發送消息:www.mldn.cn
            }
        };
        msg.send("www.mldn.cn");
    }
}           

在這樣一個程式裡面,實際上核心的功能隻有一行語句“System.out.println("消息發送:"+ str);”,但是為了這一行的核心語句依然需要按照完整的面向對象給出的設計結構進行開發。于是這些問題随着技術的發展也是越來越突出了。

範例:使用Lambda表達式實作與之前完全一樣的功能

interface IMessage{
    public void send(String str) ;
}
public class JavaDemo {
    public static void main(String[] args) {
        IMessage msg = (str)->{
            System.out.println("發送消息:"+ str) ;
        };
        msg.send("www.mldn.cn") ;
    }
 }           

現在整個程式代碼裡面真的隻是編寫了一行語句,于是利用這種形式就避免了複雜的面向對象結構化的要求。

Lambda表達式如果要想使用,那麼必須有一個重要的實作要求:SAM(Single Abstract Method),隻有一個抽象方法,以之前的IMessage接口為例,在這個接口裡面發現隻是提供有一個send()方法,除此之外沒有任何的其他方法定義,是以這樣的接口就被稱為函數式接口,而隻有函數式接口才可以被Lambda表達式所使用。

範例:使用函數式接口注解

@FunctionalInterface       //函數式接口
interface IMessage{
    public void send(String str) ;
}
public class JavaDemo {
    public static void main(String[] args) {
        IMessage msg = (str)->{
            System.out.println("發送消息:"+ str) ;
        };
        msg.send("www.mldn.cn") ;
    }
 }           

對于Lambda表達式而言,提供有如下幾種格式:

  • 方法沒有參數:()->{};
  • 方法有參數:(參數,參數)->{};
  • 如果現在隻有一行語句傳回:(參數,參數)->{語句};

範例:定義沒有參數的方法

@FunctionalInterface       //函數式接口
interface IMessage{
    public void send() ;
}
public class JavaDemo{
    public static void main(String[] args) {
        IMessage msg = ()->{
             System.out.println("發送消息:www.mldn.cn") ;
        };
        msg.send() ;
    }
 }           

範例:定義有參數的處理形式

@FunctionalInterface       //函數式接口
interface IMath{
    public int add(int x ,int y) ;
}
public class JavaDemo{
    public static void main(String[] args) {
         IMath math = (t1,t2)->{
              return t1 + t2 ;
         };
         System.out.println(math.add(10,20)) ;
    }
 }           

以上的表達式之中你會發現隻有一行語句,這個時候也可以進一步簡化

範例:簡化Lambda操作

@FunctionalInterface       //函數式接口
interface IMath{
    public int add(int x ,int y) ;
}
public class JavaDemo{
    public static void main(String[] args) {
        IMath math = (t1,t2)->t1 + t2 ;
        System.out.println(math.add(10,20)) ;
    }
 }           

利用Lambda表達式的确可以擺脫傳統面向對象之中關于結構的限制,使得代碼更加的簡便。

想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。

本内容視訊來源于

阿裡雲大學 下一篇:教你如何引用方法 | 帶你學《Java面向對象程式設計》之八十七 更多Java面向對象程式設計文章檢視此處