日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

匿名內(nèi)部類(lèi)、Lambda表達(dá)式、方法引用對(duì)比分析

作者:騎個(gè)小蝸牛 更新時(shí)間: 2023-07-10 編程語(yǔ)言

文章目錄

  • 一、匿名內(nèi)部類(lèi)
    • 1. 語(yǔ)法格式
    • 2. 使用方法
      • ① 傳統(tǒng)方式
      • ② 匿名內(nèi)部類(lèi)方式
  • 二、Lambda表達(dá)式
    • 1. 語(yǔ)法格式
    • 2. 使用方法
      • ① 匿名內(nèi)部類(lèi)方式
      • ② Lambda表達(dá)式方式
  • 三、方法引用
    • 1. 語(yǔ)法格式
    • 2. 使用方法
      • ① 類(lèi)型的靜態(tài)方法引用
      • ② 類(lèi)型的構(gòu)造方法引用
      • ③ 類(lèi)型的實(shí)例方法引用
      • ④ 對(duì)象的實(shí)例方法引用
  • 四、匿名內(nèi)部類(lèi)、Lambda表達(dá)式、方法引用對(duì)比分析總結(jié)


一、匿名內(nèi)部類(lèi)

匿名內(nèi)部類(lèi)可以看作是特殊的局部?jī)?nèi)部類(lèi),其本質(zhì)就是一個(gè)繼承類(lèi)(或?qū)崿F(xiàn)接口)的匿名子類(lèi)。

匿名內(nèi)部類(lèi)是在使用的時(shí)候動(dòng)態(tài)的指定方法體的邏輯,無(wú)需每次都去創(chuàng)建一個(gè)繼承類(lèi)(或?qū)崿F(xiàn)接口)的子類(lèi)。編譯器會(huì)在編譯階段自動(dòng)生成一個(gè)匿名子類(lèi)。

1. 語(yǔ)法格式

匿名內(nèi)部類(lèi)的語(yǔ)法格式:new 接口名|類(lèi)名(){重寫(xiě)方法}

其中,如果重寫(xiě)方法為非必要的,原則上是可以沒(méi)有重寫(xiě)方法部分的。

2. 使用方法

① 傳統(tǒng)方式

父子類(lèi):

public class ParentClass {

    public void aa(String str) {

    }

    public void bb(String str) {

    }
}
public class ChildClass extends ParentClass {

    @Override
    public void aa(String str) {
		System.out.println("自定義方法體");
    }

    @Override
    public void bb(String str) {
		System.out.println("自定義方法體");
    }
}
public class Test {

    public static void main(String[] args) {
        ParentClass ohj = new ChildClass();
    }
}

接口實(shí)現(xiàn)類(lèi):

public interface ParentInterface {

    void aa(String str);

    void bb(String str);
}
public class ChildClass implements ParentInterface {

    @Override
    public void aa(String str) {
		System.out.println("自定義方法體");
    }

    @Override
    public void bb(String str) {
		System.out.println("自定義方法體");
    }
}
public class Test {

    public static void main(String[] args) {
        ParentInterface ohj = new ChildClass();
    }
}

② 匿名內(nèi)部類(lèi)方式

父子類(lèi):

public class ParentClass {

    public void aa(String str) {

    }

    public void bb(String str) {

    }
}
public class Test {

    public static void main(String[] args) {
        ParentClass obj = new ParentClass() {
            @Override
            public void aa() {
                System.out.println("自定義方法體");
            }

            @Override
            public void bb() {
                System.out.println("自定義方法體");
            }
        };
    }
}

接口實(shí)現(xiàn)類(lèi):

public interface ParentInterface {

    void aa(String str);

    void bb(String str);
}
public class Test {

    public static void main(String[] args) {
        ParentInterface obj = new ParentInterface() {
            @Override
            public void aa() {
                System.out.println("自定義方法體");
            }

            @Override
            public void bb() {
                System.out.println("自定義方法體");
            }
        };
    }
}

二、Lambda表達(dá)式

從Java8開(kāi)始,引入了Lambda表達(dá)式。

對(duì)于只有一個(gè)抽象方法的接口(函數(shù)式接口),可以直接使用Lambda表達(dá)式創(chuàng)建它的匿名實(shí)現(xiàn)類(lèi)實(shí)例。

  • 使用匿名內(nèi)部類(lèi)方式定義的內(nèi)部類(lèi):編譯之后,會(huì)生成一個(gè)單獨(dú)的class字節(jié)碼文件(外部類(lèi)名$編號(hào).class);
  • 使用Lambda表達(dá)式定義的內(nèi)部類(lèi):編譯之后,不會(huì)生成一個(gè)單獨(dú)的class字節(jié)碼文件,對(duì)應(yīng)的字節(jié)碼會(huì)在運(yùn)行的時(shí)候動(dòng)態(tài)生成。

1. 語(yǔ)法格式

Lambda表達(dá)式的語(yǔ)法格式:(參數(shù)列表) -> {方法體}

省略寫(xiě)法:

  • 小括號(hào)內(nèi)參數(shù)的參數(shù)類(lèi)型可以省略
  • 小括號(hào)內(nèi)無(wú)參數(shù)時(shí),小括號(hào)不可省略
  • 小括號(hào)內(nèi)只有一個(gè)參數(shù)時(shí),小括號(hào)可以省略
  • 小括號(hào)內(nèi)有多個(gè)參數(shù)時(shí),小括號(hào)不可省略
  • 大括號(hào)內(nèi)有且只有一行語(yǔ)句時(shí),可以省略

2. 使用方法

public interface ParentInterface {

    void aa(String str);
}

① 匿名內(nèi)部類(lèi)方式

public class Test {

    public static void main(String[] args) {
        ParentInterface obj = new ParentInterface() {
            @Override
            public void aa(String str) {
                System.out.println("自定義方法體");
            }
        };
    }
}

② Lambda表達(dá)式方式

public class Test {

    public static void main(String[] args) {
        ParentInterface obj = str -> System.out.println("自定義方法體");
    }
}

三、方法引用

方法引用是對(duì)Lambda表達(dá)式進(jìn)一步簡(jiǎn)化,借用其他類(lèi)的方法體,省去了寫(xiě)方法體的過(guò)程。

對(duì)于方法體只有一行代碼的Lambda表達(dá)式(該行代碼為調(diào)用某個(gè)類(lèi)或某個(gè)實(shí)例的方法時(shí)),可以簡(jiǎn)潔為更簡(jiǎn)單的方法引用的方式。

1. 語(yǔ)法格式

方法引用的語(yǔ)法格式:

語(yǔ)法種類(lèi) 語(yǔ)法格式 示例 參數(shù)對(duì)應(yīng)關(guān)系
類(lèi)型的靜態(tài)方法引用 類(lèi)::靜態(tài)方法 String::valueOf 抽象方法的參數(shù)與靜態(tài)方法的參數(shù)順序?qū)?yīng)
類(lèi)型的構(gòu)造方法引用 類(lèi)::new String::new 抽象方法的參數(shù)與構(gòu)造方法的參數(shù)順序?qū)?yīng)
類(lèi)型的實(shí)例方法引用 類(lèi)::實(shí)例方法 String::replaceAll 抽象方法的第一個(gè)參數(shù)為調(diào)用引用方法的實(shí)例對(duì)象

抽象方法的剩余參數(shù)與實(shí)例方法的參數(shù)順序?qū)?yīng)
對(duì)象的實(shí)例方法引用 對(duì)象::實(shí)例方法 s::replaceAll 實(shí)例對(duì)象s為外部參數(shù)

抽象方法的參數(shù)與實(shí)例方法的參數(shù)順序?qū)?yīng)

需要注意:

  • 當(dāng)接口的抽象方法無(wú)返回值時(shí),方法引用的方法有無(wú)返回值都可以;
  • 當(dāng)接口的抽象方法有返回值時(shí),方法引用的方法也必須有返回值,且返回值類(lèi)型 instanceof 接口的抽象方法返回值類(lèi)型

2. 使用方法

① 類(lèi)型的靜態(tài)方法引用

類(lèi)型的靜態(tài)方法引用:類(lèi)名::靜態(tài)方法

對(duì)應(yīng)Lambda表達(dá)式:(參數(shù)1,參數(shù)2,…) -> 類(lèi)名.靜態(tài)方法(參數(shù)1,參數(shù)2,…)

@FunctionalInterface
public interface ParentInterface {

    String aa(String s);
}
public class Test {

    public static void main(String[] args) {
        // 類(lèi)型的靜態(tài)方法引用
        ParentInterface parentInterface1 = String::valueOf;
        // 對(duì)應(yīng)Lambda表達(dá)式方式
        ParentInterface parentInterface2 = s -> String.valueOf(s);
    }
}

② 類(lèi)型的構(gòu)造方法引用

類(lèi)型的構(gòu)造方法引用:類(lèi)::new

對(duì)應(yīng)Lambda表達(dá)式:(參數(shù)1,參數(shù)2,…) -> new 類(lèi)名(參數(shù)1,參數(shù)2,…)

@FunctionalInterface
public interface ParentInterface {

    String aa(String s);
}
public class Test {

    public static void main(String[] args) {
        // 類(lèi)型的構(gòu)造方法引用
        ParentInterface parentInterface1 = String::new;
        // 對(duì)應(yīng)Lambda表達(dá)式方式
        ParentInterface parentInterface2 = s -> new String(s);
    }
}

③ 類(lèi)型的實(shí)例方法引用

類(lèi)型的實(shí)例方法引用:類(lèi)::實(shí)例方法

對(duì)應(yīng)Lambda表達(dá)式:(參數(shù)1,參數(shù)2,…) -> 參數(shù)1.靜態(tài)方法(參數(shù)2,…)

@FunctionalInterface
public interface ParentInterface {

    String aa(String s1, String s2, String s3);
}
public class Test {

    public static void main(String[] args) {
        // 類(lèi)型的實(shí)例方法引用
        ParentInterface parentInterface1 = String::replaceAll;
        // 對(duì)應(yīng)Lambda表達(dá)式方式
        ParentInterface parentInterface2 = (s1,s2,s3) -> s1.replaceAll(s2,s3);
    }
}

④ 對(duì)象的實(shí)例方法引用

對(duì)象的實(shí)例方法引用:對(duì)象::實(shí)例方法

對(duì)應(yīng)Lambda表達(dá)式:(參數(shù)1,參數(shù)2,…) -> 對(duì)象.靜態(tài)方法(參數(shù)1,參數(shù)2,…)

@FunctionalInterface
public interface ParentInterface {

    String aa(String s1, String s2);
}
public class Test {

    public static void main(String[] args) {
        String s = "";
        // 對(duì)象的實(shí)例方法引用
        ParentInterface parentInterface1 = s::replaceAll;
        // 對(duì)應(yīng)Lambda表達(dá)式方式
        ParentInterface parentInterface2 = (s1,s2) -> s.replaceAll(s1,s2);
    }
}

四、匿名內(nèi)部類(lèi)、Lambda表達(dá)式、方法引用對(duì)比分析總結(jié)

  • Lambda表達(dá)式是匿名內(nèi)部類(lèi)的簡(jiǎn)寫(xiě)(匿名內(nèi)部類(lèi)為函數(shù)式接口的實(shí)現(xiàn)的這種)
  • 方法引用是Lambda表達(dá)式的簡(jiǎn)寫(xiě)(Lambda表達(dá)式的方法體只有一行代碼且該行代碼方法調(diào)用)

原文鏈接:https://blog.csdn.net/JokerLJG/article/details/129051108

  • 上一篇:沒(méi)有了
  • 下一篇:沒(méi)有了
欄目分類(lèi)
最近更新