亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中怎樣使用Lambda表達式

發布時間:2021-10-11 16:33:54 來源:億速云 閱讀:157 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關java中怎樣使用Lambda表達式的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

首先Lambda表達式的最簡單應用如下

Lambda表達式法

String lam= "初次相識Lambda";
        new Thread(() -> System.out.println(lam)).start();

傳統方法

  String tradition="傳統方法";
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(tradition);
            }
        }).start();

輸出結果

java中怎樣使用Lambda表達式

很簡潔有沒有?省略了好多代碼是不是,在這里 你可以發現”,Lambda表達式和在Thread創建一個匿名類的作用是一樣。我們可以這樣認為Lambda表達式本身代表了一個匿名類。

這就是Lambda最大的作用,當然Lambda表達式只能創建接口interface對象。 創建類是不行的,抽象類也是不行的 ,只要是類都是不行的。

首先,我定義了一個自定義的接口,可以用來測試

@FunctionalInterface
public interface Lam {
    //Lambda表達式調用的方法
    void bda();
    
    //接口的默認方法
    default void test(){
        System.out.println("我是默認的方法");
    };
    //接口的靜態方法
    static void test1(){
        System.out.println("我是靜態方法");
    }
}

使用Lambda表達式 你首先要知道的

1.Lambda表達式只能是接口 interface的創建(PS從上面的例子可以看出來,Runnable是接口,可以查看源代碼),并且這個接口只能包含一個方法(除了default方法和static方法)。在接口中創建default方法和static方法都必須要實現方法體如下圖

java中怎樣使用Lambda表達式

2.如果你用Lambda表達式來創建類 class,則會出現以下錯誤 ”Target type of a lambda conversion must be an interface“如果你怕自己的定義的接口不符合Lambda表達式的規范 ,你可以在接口interfaca 上面添加注解@FunctionalInterface

3.Lambda表達式的規范表示格式 (parameters) ->{ statements; }。在某些時刻,你還可以簡化這個格式

  //接口定義的方法無參數時候,并且你想要執行操作也只有一句代碼的時候,Lambda會自動返回一句代碼,并且可以不用加{}
        Lam lam1=()->System.out.println("無參數");

你可以發現后面的大括號{ }沒了,這是因為后面代碼如果只有一句的話,是可以省略{ } 的

我們把Lam接口定義的調用方法參數修改一下,多出了一個String類型的形參s

 //Lambda表達式調用的方法
    void bda(String s);

這時候 我們如果使用Lambda表達式,則可以這樣

//接口定義的方法有參數時候,并且你想要執行的操作也只有一句代碼的時候
        Lam lam1=e->System.out.println(e);//這一句還有簡化版本  Lam lam1=System.out::println;
        lam1.bda("4556");

你又會發現,前面的()中括號也沒了,這是因為當參數只有一個的時候,是可以省略()的。

當然也有你要執行很多代碼的時候,那這時候可以這樣

 //接口定義的方法有參數時候,并且你想要執行的操作有很多句代碼的時候
        Lam lam1 = (String e) -> {
            String a = e + "add";
            System.out.println(a);
        };
        lam1.bda("test+");

輸出結果如下

java中怎樣使用Lambda表達式

當然你還會問Lambda表達式能不能返回東西呢?這是肯定能的,首先我們再把上面的Lam接口方法修改一下

 //Lambda表達式調用的方法
    String bda(String s);

讓bda方法返回一個String值,這次如果我們用Lambda的話

//接口定義的方法有返回值的時候
        Lam lam1=s ->{System.out.println(s);return "我是返回的數據";};
        lam1.bda("test1");
        System.out.println(lam1.bda("test2"));

運行的結果:

java中怎樣使用Lambda表達式

總結 Lambda表達式 就是用來創建一個匿名的接口對象,即 它本身就是一個接口的匿名實例。只不過這個接口 有一些條件限制。

Lambda表達式的技巧

Lambda表達式只能用來簡化僅包含一個public方法的接口的創建

規則

  • 1.只能是接口

    • 否則報:Target type of a lambda conversion must be an interface

  • 2.只能有一個public方法

    • 否則報:Multiple non-overriding abstract methods found AInterface

    • 或AInterface is not a functional interface

括號形式

testA((int i, int j) -> {});參數要與接口一致

public class Go {
    public static void main(String a[]) {
        //正確示范
        testA((int i, int j) -> {});
        //錯誤示范:Multiple non-overriding abstract methods found xxx;只能有一個public方法
        testB((int i, int j) -> {});
        //錯誤示范:Target type of a lambda conversion must be an interface;只能是接口
        testC((int i, int j) -> {});
    }
    public static void testA(AInterface t) {    }
    public static void testC(CInterface t) {}
    public static void testB(BInterface t) {}
    interface AInterface {
        void xxx(int i, int j);
    }
    interface BInterface {
        void xxx(int i, int j);
        void YYY(int i, int j);
    }
    abstract class CInterface {
        abstract void xxx(int i, int j);
    }
}

雙冒號表達形式

  • 雙冒號后面必須是靜態方法

    • 否則報錯:Non-static method cannot be referenced from a static context

  • 雙冒號后面的方法與接口方法參數一樣

  • 方法與接口的權限可以不一樣

  • 返回類型:如果接口里面方法是void,雙冒號后的方法可以任意返回類型,否則要一致

public class Go {
    public static void main(String a[]) {
        //之前的寫法
        testA(new AInterface() {
            @Override
            public void xxx(int i, int j) {
                
            }
        });
        //正確,相對與接口里面xxx方這是改成靜態和換了個名字
        testA(Go::mydog);
        //正確,加了返回類型和public換成private,也是ok
        testA(Go::mydog2);
        
        //錯誤:Non-static method cannot be referenced from a static context
        testA(Go::mydog3);
        //這樣寫也是ok的。
        AInterface aInterface = Go::mydog;
        testA(aInterface);
    }
    public static void testA(AInterface t) {
        t.xxx(1, 2);
    }
    interface AInterface {
        void xxx(int i, int j);
    }
    public static boolean mydog(int i, int j) {
        System.out.println("mydog" + i + " & " + j);
        return false;
    }
    private static void mydog2(int i, int j) {
        System.out.println("mydo2" + i + " & " + j);
    }
    public void mydog3(int i, int j) {
        System.out.println("mydog3" + i + " & " + j);
    }
}

感謝各位的閱讀!關于“java中怎樣使用Lambda表達式”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宁化县| 海宁市| 万年县| 乌海市| 沈阳市| 岳阳市| 湛江市| 荥阳市| 伊春市| 乌兰县| 石泉县| 上饶县| 兰坪| 瑞金市| 大厂| 鞍山市| 揭阳市| 南部县| 土默特左旗| 开阳县| 洪洞县| 辽阳县| 全椒县| 溧阳市| 深圳市| 九江市| 资溪县| 浙江省| 抚州市| 霍山县| 永年县| 西城区| 塔城市| 天祝| 五大连池市| 凤翔县| 察隅县| 自治县| 陕西省| 宣城市| 花垣县|