Java8新特性——Lambda 表達式


Lambda 表達式

​ ​ ​ ​ ​ ​ ​ ​ Lambda 表達式的實質屬於函數式編程。

​ ​ ​ ​ ​ ​ ​ ​ 語法格式為:(parameters) -> expression(parameters) ->{statements; }
​ ​ ​ ​ ​ ​ ​ ​

Lambda 表達式的特點

  • Lambda 表達式只能引用標記了 final 的外層局部變量
  • 不能在lambda 內部修改定義在域外的局部變量
  • Lambda 表達式的局部變量可以不用聲明為 final,但是必須不可被后面的代碼修改(自帶 final)
  • Lambda 表達式當中不允許聲明一個與局部變量同名的參數或者局部變量
    ​ ​ ​ ​ ​ ​ ​ ​

Lambda 表達式的作用

  • 避免匿名內部類定義過多
  • 讓代碼更簡潔,只留下核心邏輯
    ​ ​ ​

函數式接口

​ ​ ​ ​ ​ ​ ​ ​ 函數式接口 Functional Interface,是只包含唯一一個抽象方法的接口。對於函數式接口,可以通過 Lambda 表達式來直接創建該接口的對象。如 Runnable 接口:

public interface Runnable {
    public abstract void run();
}

使用 Lambda 表達式實現 Runnable

//常規寫法
new Thread(new Runnable(){
    @Override
    public void run(){
        ...
    }
}).start();

//Lambda 表達式
new Thread( () -> {
    ...
}).start();

​ ​ ​ ​ ​ ​ ​ ​
JDK 1.8之前已有的函數式接口:

  • java.lang.Runnable
  • java.util.concurrent.Callable
  • java.security.PrivilegedAction
  • java.util.Comparator
  • java.io.FileFilter
  • java.nio.file.PathMatcher
  • java.lang.reflect.InvocationHandler
  • java.beans.PropertyChangeListener
  • java.awt.event.ActionListener
  • javax.swing.event.ChangeListener

JDK 1.8 新增加的函數接口:

  • java.util.function

​ ​ ​ ​ ​ ​ ​ ​

Lambda 表達式的簡化過程

​ ​ ​ ​ ​ ​ ​ ​ 實現類-->靜態內部類-->局部內部類-->匿名內部類-->Lambda 表達式

​ ​ ​ ​ ​ ​ ​ ​ 簡化過程如下:

實現類

public class TestLamda01 {
	public static void main(String[] args) {
    DoSports jog = new Jog();
    }
}

interface DoSports{
    void start();
}

//實現類
class Jog1 implements DoSports{
    @Override
    public void start() {
        System.out.println("I'm jogging");
    }
}

靜態內部類

public class TestLambda01 {
	//靜態內部類
    static class Jog implements DoSports{
        public void start(){
            System.out.println("I'm jogging");
        }
    }

    public static void main(String[] args) {
        DoSports jog = new Jog();
        jog.start();
    }
}

interface DoSports{
    void start();
}

局部內部類

public class TestLambda01 {

    public static void main(String[] args) {
		//局部內部類
        class Jog implements DoSports{
            public void start(){
                System.out.println("I'm jogging");
            }
        }
        DoSports jog = new Jog();
        jog.start();
    }
}

interface DoSports{
    void start();
}

匿名內部類

public class TestLambda01 {

    public static void main(String[] args) {


        DoSports jog = new DoSports(){
            public void start(){
                System.out.println("I'm jogging");
            }
        };
        jog.start();
    }
}

interface DoSports{
    void start();
}

​ ​ ​ ​ ​ ​ ​ ​
Lambda 表達式

public class TestLambda01 {

    public static void main(String[] args) {
        
        DoSports jog = ()->{
            System.out.println("I'm jogging"); //start() 方法執行主體
        };
        jog.start();
    }
}

interface DoSports{
    void start();
}

含參數的 Lambda 表達式簡化

​ ​ ​ ​ ​ ​ ​ ​ 當只有一個參數時,可簡化參數類型和括號

public class TestLambda01 {

    public static void main(String[] args) {
        /*可簡化參數類型和括號
        DoSports jog = (int a)->{
            ...
        };*/
        DoSports jog = a->{
            //start() 方法執行主體
            ...
        };
        jog.start(參數1);
    }
}

interface DoSports{
    void start(int a);
}

​ ​ ​ ​ ​ ​ ​ ​ 當有多個參數時,可簡化參數類型,必須加括號

public class TestLambda01 {

    public static void main(String[] args) {
        /*可簡化參數類型和括號
        DoSports jog = (int a,String b)->{
            ...
        };*/
        DoSports jog = (a,b)->{
            //start() 方法執行主體
            ...
        };
        jog.start(參數1,參數2);
    }
}

interface DoSports{
    void start(int a,String b);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM