1. 程式人生 > 實用技巧 >Lambda 表示式與匿名內部類_程式碼

Lambda 表示式與匿名內部類_程式碼

* lambda使用條件:
* 1.使用lambda需要有介面,並且介面只有一個抽象方法。
* 2.必須要有上下文環境,才能推匯出型別。
*
*
* lambda和匿名內部類區別:
* 所需型別不同
* 匿名內部類:可以是介面,也可以是抽象類,還可以是具體類
* Lambda表示式:只能是介面
* 使用限制不同
* 如果介面中有且僅有一個抽象方法,可以使用Lambda表示式,也可以使用匿名內部類
* 如果介面中多於一個抽象方法,只能使用匿名內部類,而不能使用Lambda表示式
* 實現原理不同
* 匿名內部類:編譯之後,產生一個單獨的.class位元組碼檔案
* Lambda表示式:編譯之後,沒有一個單獨的.class位元組碼檔案。對應的位元組碼會在執行的時候動態生成

都以一個為例子: 在Tailor裡的makeClothes裡,使用Humain介面作為引數。

1. 無引數無返回值的匿名內部類與Lambda表示式

Human介面:

public interface Human {
    public void wear();
}

Tailor類:

public class Tailor {
    public void makeClothes(Human human) {
        human.wear();
        System.out.println("tailor start make clothes");
    }
}

1.1 匿名內部類

public class TestLambda {
    public static void main(String[] args) {
        Tailor tailor = new Tailor();
        tailor.makeClothes(new Human() {
            @Override
            public void wear() {
                System.out.println("women wear a skirt");
            }
        });
    }
}

1.2 lambda表示式

public class TestLambda {
    public static void main(String[] args) {
        Tailor tailor = new Tailor();
        tailor.makeClothes(
            ()->{
                System.out.println("women wear a skirt");
            }
        );
    }
}

結果:

2.有引數無返回值的匿名內部類與Lambda表示式

Human介面:

public interface Human {
    public void wear(String color);
}

Tailor類:

public class Tailor {
    private String color = "red";
    public void makeClothes(Human human) {
        human.wear(color);
        System.out.println("tailor start make clothes");
    }
}

2.1 匿名內部類

public class TestLambda {
    public static void main(String[] args) {
        Tailor tailor = new Tailor();
        tailor.makeClothes(new Human() {
            @Override
            public void wear(String color) {
                System.out.println("woman wear" + color + " shirt");
            }
        });
    }
}

2.2 lambda表示式

public class TestLambda {
    public static void main(String[] args) {
        Tailor tailor = new Tailor();
        tailor.makeClothes(
            (color)->{
                System.out.println("woman wear " + color + " shirt");
            }
        );
    }
}

這裡color的括號也可以去掉

結果:

3.有引數有返回值的匿名內部類與Lambda表示式

Human介面:

public interface Human {
    public boolean wear(String color);
}

Tailor類:

public class Tailor {
    private String color = "red";
    public void makeClothes(Human human) {
        boolean b = human.wear(color);
        System.out.println("is it easy?" + b);
    }
}

3.1 匿名內部類

public class TestLambda {
    public static void main(String[] args) {
        Tailor tailor = new Tailor();
        tailor.makeClothes(new Human() {
            @Override
            public boolean wear(String color) {
                System.out.println("woman wear " + color + " skirt");
                return true;
            }
        });
    }
}

3.2 lambda表示式

public class TestLambda {
    public static void main(String[] args) {
        Tailor tailor = new Tailor();
        tailor.makeClothes(
            color -> {
                System.out.println("woman wear " + color + " skirt");
                return true;
            }
        );
    }
}

結果: