<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Lambda 表達式 > 原文: [https://howtodoinjava.com/java8/lambda-expressions/](https://howtodoinjava.com/java8/lambda-expressions/) **java lambda 表達式**是 Java 8 附帶的一個非常令人興奮的新特性。 對于我們許多使用 scala 之類的高級語言工作的人來說,它們并不陌生。 實際上,如果您回顧歷史并嘗試找出過去 20 年中 Java 語言的任何改進,您將無法回憶起許多令人興奮的事情。 在過去的十年中,java 中只有很少的并發類,泛型,如果您也同意,那么注釋也是如此。 Lambda 表情打破了這種干旱,感覺就像是一件令人愉快的禮物。 ![lambda](https://img.kancloud.cn/ce/69/ce69473edf91acb1ab55abf995eb7f33_344x209.png) 在本文中,我將分三部分介紹 lambda 表達式及其概念。 以下是繼續進行的計劃。 ```java Table of Contents 1\. What is a lambda expression in Java? 2\. Java 8 functional interface 3\. Lambda expression examples ``` 讓我們堅持計劃并逐步進行。 ## 1\. Java 中的 lambda 表達式是什么? 在編程中, **Lambda 表達式(或函數)只是一個匿名函數,即不帶名稱且不受標識符**約束的函數。 換句話說,**lambda 表達式是無名稱的函數,以常量值形式給出,并精確地寫在需要的地方,通常作為其他函數的參數**。 Lambda 表達式的最重要特征是**它們在其出現**的上下文中執行。 因此,類似的 lambda 表達式可以在其他一些上下文中以不同的方式執行(即邏輯是相同的,但基于傳遞給函數的不同參數,結果將有所不同)。 上面的定義充滿了關鍵字,只有當您已經深入了解什么是 lambda 表達式時才能理解。 因此,一旦您對下一部分中的 lambda 表達式有了更好的了解,我建議您重新閱讀以上段落。 因此,很明顯 lambda 是某種沒有名稱和標識符的函數。 好吧,有什么大不了的? 為什么每個人都這么興奮? 答案在于,與面向對象編程(OOP)相比,函數式編程所帶來的好處。 大多數 OOP 語言圍繞對象和實例發展,并且僅將它們作為頭等公民對待。 另一個重要的實體,即職能倒退。 在 Java 中尤其如此,在 Java 中,函數不能存在于對象外部。 函數本身在 Java 中沒有任何意義,直到它與某個對象或實例相關為止。 但是在函數式編程中,您可以定義函數,為它們提供引用變量并將其作為方法參數傳遞等等。 JavaScript 是一個很好的例子,您可以在其中傳遞回調方法,例如到 Ajax 調用。 這是非常有用的特性,并且從一開始就在 Java 中缺少。 現在使用 Java 8,我們也可以使用這些 lambda 表達式。 #### 1.1 Lambda 語法 典型的 lambda 表達式語法如下所示: ```java (x, y) -> x + y //This function takes two parameters //and return their sum. ``` 現在基于`x`和`y`的類型,可以在多個地方使用方法。 參數可以匹配`int`或`Integer`或簡單地也可以匹配`String`。 根據上下文,它將添加兩個整數或連接兩個字符串。 語法: lambda 表達式的其他可能語法為: ```java either (parameters) -> expression //1 or (parameters) -> { statements; } //2 or () -> expression //3 ``` #### 1.2 Lambda 示例 我們還來看一些 lambda 表達式的示例: ```java (int a, int b) -> a * b // takes two integers and returns their multiplication (a, b) -> a - b // takes two numbers and returns their difference () -> 99 // takes no values and returns 99 (String a) -> System.out.println(a) // takes a string, prints its value to the console, and returns nothing a -> 2 * a // takes a number and returns the result of doubling it c -> { //some complex statements } // takes a collection and do some procesing ``` #### 1.3 Lambda 表達式的特性 讓我們確定 lambda 表達式的一些**特性:** 1. Lambda 表達式可以具有零個,一個或多個參數。 2. 參數的類型可以顯式聲明,也可以從上下文中推斷出來。 3. 多個參數用強制括號括起來,并用逗號分隔。 空括號用于表示空參數集。 4. 當有單個參數時,如果推斷出其類型,則不強制使用括號。 例如`a -> a * a`。 5. Lambda 表達式的主體可以包含零個,一個或多個語句。 6. 如果 lambda 表達式的主體具有單個語句,則不必使用大括號,并且匿名函數的返回類型與主體表達式的返回類型相同。 如果正文中的語句多于一個,則這些語句必須用大括號括起來。 因此,我們簡要了解了什么是 lambda 表達式。 如果您感到迷茫且無法聯系,請耐心等待,如何在 Java 編程語言中使用它。 我們將在接下來的 30 分鐘內解決所有問題。 讓我們開始吧。 在深入研究 lambda 表達式和 Java 編程之間的關系之前,您還必須了解**函數式接口**。 這太重要了。 ## 2\. Java 8 函數式接口 **單一抽象方法接口**(SAM 接口)不是一個新概念。 這意味著**僅使用一種方法**進行接口。 在 Java 中,我們已經有許多此類 SAM 接口的示例。 從 Java 8 開始,它們也將**也稱為函數式接口**。 Java 8 通過使用新的注釋(即`@FunctionalInterface`)標記這些接口來實現單一職責規則。 例如,`Runnable`接口的新定義是這樣的: ```java @FunctionalInterface public interface Runnable { public abstract void run(); } ``` 如果嘗試在任何函數式接口中添加新方法,則編譯器將不允許您執行此操作,并且會引發編譯時錯誤。 到目前為止,一切都很好。 但是,**它們與 Lambda 表達式有何關系?** 讓我們找出答案。 我們知道 Lambda 表達式是不帶名稱的匿名函數,它們(大多數)作為參數傳遞給其他函數。 好吧,在 Java 方法中,參數總是具有類型,并且在確定方法重載甚至是簡單方法調用的情況下,都會尋找此類型信息以確定需要調用哪個方法。 因此,基本上每個 lambda 表達式也必須都可以轉換為某種類型才能被接受為方法參數。 好吧,用于轉換 lambda 表達式的**類型始終是函數式接口類型**。 讓我們通過一個例子來理解它。 如果我們必須編寫一個在控制臺上打印`"howtodoinjava"`的線程,那么最簡單的代碼將是: ```java new Thread(new Runnable() { @Override public void run() { System.out.println("howtodoinjava"); } }).start(); ``` 如果我們使用 lambda 表達式執行此任務,則代碼將為: ```java new Thread( () -> { System.out.println("My Runnable"); } ).start(); ``` 我們還看到`Runnable`是具有單個方法`run()`的函數式接口。 因此,當您將 lambda 表達式傳遞給`Thread`類的構造器時,編譯器將嘗試將該表達式轉換為等效的`Runnable`代碼,如第一個代碼示例所示。 如果編譯器成功,則一切運行良好,如果編譯器無法將表達式轉換為等效的實現代碼,它將抱怨。 在此,在上面的示例中,lambda 表達式被轉換為`Runnable`類型。 簡單來說,lambda 表達式是函數式接口的實例。 但是,lambda 表達式本身并不包含有關它正在實現哪個函數接口的信息。 該信息是從使用它的上下文中推導出來的。 ## 3\. Java 8 lambda 表達式示例 我列出了一些代碼示例,您可以閱讀并分析如何在日常編程中使用 lambda 表達式。 **1)遍歷一個列表并執行一些操作** ```java List<String> pointList = new ArrayList(); pointList.add("1"); pointList.add("2"); pointList.forEach(p -> { System.out.println(p); //Do more work } ); ``` **2)創建一個新的可運行對象,并將其傳遞給線程** ```java new Thread( () -> System.out.println("My Runnable"); ).start(); ``` **3)按員工名稱**對其排序 ```java public class LambdaIntroduction { public static void main (String[] ar){ Employee[] employees = { new Employee("David"), new Employee("Naveen"), new Employee("Alex"), new Employee("Richard")}; System.out.println("Before Sorting Names: "+Arrays.toString(employees)); Arrays.sort(employees, Employee::nameCompare); System.out.println("After Sorting Names "+Arrays.toString(employees)); } } class Employee { String name; Employee(String name) { this.name = name; } public static int nameCompare(Employee a1, Employee a2) { return a1.name.compareTo(a2.name); } public String toString() { return name; } } Output: Before Sorting Names: [David, Naveen, Alex, Richard] After Sorting Names [Alex, David, Naveen, Richard] ``` **4)將事件監聽器添加到 GUI 組件** ```java JButton button = new JButton("Submit"); button.addActionListener((e) -> { System.out.println("Click event triggered !!"); }); ``` 上面是 Java 8 中 lambda 表達式的非常基本的示例。我將不時提出一些更有用的示例和代碼示例。 學習愉快!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看