Java8新特性(二)------lamda表達式

 Ø  基礎講解

  Lambda表達式是一種基於函數的編程語言,下面我們來演示一下java8中lambda表達式的運用,根據例子來分析一下java8中lambda表達式的改進。

  新建一個項目,這個項目必須是基於java8的,我使用的IDE編輯器是idea,故而配置idea的jdk環境爲java8,配置如圖:


  我們先來看一下傳統的寫法:

第一種實現方式
interface  Message{
    public  void  print(String str);
}
public class TestDemo {
    public static void main( String[] args ) {
        /**
         * 使用的是匿名內部類的方式
         */
        Message msg = new Message() {
            @Override
            public void print( String str ) {
                System.out.println(str);
            }
        };

        msg.print("hello world!");
    }
}

  我們用lambda表達式再來進行書寫呢?

interface  Message{
    public  void  print(String str);
}

//定義一個統一的接口
public class TestDemo {
    public static void main( String[] args ) {
        /**
         * 使用lambda表達式的方式
         */
        Message msg=(s)-> System.out.println(s);
        msg.print("hello world!");
    }
}

  我們會發現代碼明顯減少了好多,那麼這些代碼怎麼理解呢?

  詳解一下吧:

   (s)->System.out.println(s)

  (語法結構:參數,名稱隨意->方法體)

      S-------是一個參數,這個參數名稱是可以隨意起的,但是有一定的要求,那就是必須與接口Message定義的print方法的參數類型一致,但是此處是可以進行聲明也可以不聲明,追求完美度高的用戶可以進行聲明。

              寫法: Message msg=(String s)-> System.out.println(s);    lambda表達式

         ->: 是一個固定的寫法,表示的方法指向方法體

      方法體:就是在進行早期匿名內部類實現方法的時候所編寫的方法體代碼。

  在使用lambda表達式的時候有一個最爲重要的定義要求,那就是接口裏面的方法只能存在一個。使用lambda表達式爲了直接能夠找到對應的方法,只能是定義一個。

  特別需要注意的是

  1、  lambda表達式最重要的目的是解決匿名內部類的問題;

  2、   想要使用lambda表達式,那麼必須以接口爲主,而且接口裏面只能夠定義一個抽象方法。

 Ø  示例說明

  比如我們以實現runnable()接口爲例來進行說明

import java.text.MessageFormat;

/**
 * Created by xiaona on 2016/5/29.
 */
public class TestRunnable {
    public static void main( String[] args ) {
        new Runnable() {
            @Override
            public void run() {

                System.out.println("匿名內部類實現Runnable方法");
            }
        }.run();


        /**
         * 使用lambda表達式進行實現
         */
        int i=1;
        Runnable r=()->{
            System.out.println("用lambda實現Runnable方法");
            System.out.println(MessageFormat.format("i={0}", i));
        };
        r.run();
    }
}

  除了像這樣接口似得實現,我們也可以自己定義一個匿名內部類實現登錄操作,同樣是可以進行實現的

public class TestAction {
    public static void main( String[] args ) {
        new Action(){
            @Override
            public void execute( String content ){
            System.out.println(content);
        }
        }.execute("java8之前實現的登錄的操作");

        Action  login=(content)-> {System.out.println(content);};
        login.execute("java8實現的登錄操作");
    }

    static  interface Action{
        void execute(String content);
    }
}
  細心的我們會發現,使用lambda表達式與匿名類的不同在於不僅僅是代碼變得簡潔了,還有就是匿名類編譯完畢的class文件是有$符號,而使用lambda表達式是沒有的。
發佈了218 篇原創文章 · 獲贊 29 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章