<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Java Lambda 表達式 > 原文: [https://www.programiz.com/java-programming/lambda-expression](https://www.programiz.com/java-programming/lambda-expression) #### 在本文中,我們將借助示例學習 Java lambda 表達式以及 lambda 表達式與函數式接口,通用函數式接口和流 API 的結合使用。 lambda 表達式是在 Java 8 中首次引入的。其主要目的是提高語言的表達能力。 但是,在進入 lambda 之前,我們首先需要了解函數式接口。 * * * ## 什么是函數式接口? 如果 Java 接口僅包含一個抽象方法,則將其稱為函數式接口。 僅這一種方法指定了接口的預期用途。 例如,包`java.lang`中的`Runnable`接口; 由于它僅構成一種方法,即`run()`,因此它是一個函數式接口。 ### 示例 1:在 java 中定義函數式接口 ```java import java.lang.FunctionalInterface; @FunctionalInterface public interface MyInterface{ // the single abstract method double getValue(); } ``` 在上面的示例中,接口`MyInterface`只有一個抽象方法`getValue()`。 因此,它是一個函數式接口。 在這里,我們使用了注解`@FunctionalInterface`。 該注解會強制 Java 編譯器指示該接口是函數式接口。 因此,不允許有多個抽象方法。 但是,它不是強制性的。 在 Java 7 中,函數式接口被視為[單一抽象方法](https://stackoverflow.com/a/23342625/4494547)或 **SAM** 類型。 SAM 通常用 Java 7 中的匿名類實現。 ### 示例 2:使用 Java 中的匿名類實現 SAM ```java public class FunctionInterfaceTest { public static void main(String[] args) { // anonymous class new Thread(new Runnable() { @Override public void run() { System.out.println("I just implemented the Runnable Functional Interface."); } }).start(); } } ``` **輸出**: ```java I just implemented the Runnable Functional Interface. ``` 在這里,我們可以將匿名類傳遞給方法。 這有助于用 Java 7 用更少的代碼編寫程序。但是,語法仍然很困難,并且需要很多額外的代碼行。 Java 8 進一步擴展了 SAM 的功能。 由于我們知道函數式接口只有一種方法,因此在將其作為參數傳遞時,無需定義該方法的名稱。 Lambda 表達式使我們能夠做到這一點。 * * * ## Lambda 表達式簡介 Lambda 表達式本質上是一個匿名或未命名的方法。 lambda 表達式不能單獨執行。 相反,它用于實現函數式接口定義的方法。 ### 如何在 Java 中定義 Lambda 表達式? 這是我們如何在 Java 中定義 lambda 表達式。 ```java (parameter list) -> lambda body ``` 使用的新運算符(`->`)被稱為箭頭運算符或 lambda 運算符。 目前語法尚不清楚。 讓我們探索一些例子, 假設我們有一個這樣的方法: ```java double getPiValue() { return 3.1415; } ``` 我們可以使用 lambda 表達式編寫此方法,如下所示: ```java () -> 3.1415 ``` 在此,該方法沒有任何參數。 因此,運算符的左側包括一個空參數。 右側是 lambda 主體,用于指定 lambda 表達式的操作。 在這種情況下,它將返回值 3.1415。 * * * ### Lambda 主體的類型 在 Java 中,lambda 主體有兩種類型。 **1.具有單個表達式的正文** ```java () -> System.out.println("Lambdas are great"); ``` 這種類型的 lambda 主體稱為表達式主體。 **2.由代碼塊組成的正文** ```java () -> { double pi = 3.1415; return pi; }; ``` 這種類型的 lambda 體稱為塊體。 塊主體允許 lambda 主體包含多個語句。 這些語句包含在括號內,您必須在括號后添加分號。 **注意**:對于塊體,您應該始終有一個`return`語句。 但是,表達式主體不需要`return`語句。 * * * ## 示例 3:Lambda 表達式 讓我們編寫一個 Java 程序,該程序使用 lambda 表達式返回`Pi`的值。 如前所述,lambda 表達式不是單獨執行的。 相反,它形成了由函數式接口定義的抽象方法的實現。 因此,我們需要首先定義一個函數式接口。 ```java import java.lang.FunctionalInterface; // this is functional interface @FunctionalInterface interface MyInterface{ // abstract method double getPiValue(); } public class Main { public static void main( String[] args ) { // declare a reference to MyInterface MyInterface ref; // lambda expression ref = () -> 3.1415; System.out.println("Value of Pi = " + ref.getPiValue()); } } ``` **輸出**: ```java Value of Pi = 3.1415 ``` 在上面的示例中, * 我們創建了一個名為`MyInterface`的函數式接口。 它包含一個名為`getPiValue()`的抽象方法 * 在`Main`類中,我們聲明了對`MyInterface`的引用。 請注意,我們可以聲明接口的引用,但不能實例化接口。 即 , ```java // it will throw an error MyInterface ref = new myInterface(); // it is valid MyInterface ref; ``` * 然后,我們為引用分配了一個 lambda 表達式。 ```java ref = () -> 3.1415; ``` * 最后,我們使用引用接口調用方法`getPiValue()`。 當 時 ```java System.out.println("Value of Pi = " + ref.getPiValue()); ``` * * * ## 帶參數的 Lambda 表達式 到目前為止,我們已經創建了不帶任何參數的 lambda 表達式。 但是,類似于方法,lambda 表達式也可以具有參數。 例如, ```java (n) -> (n%2)==0 ``` 在此,括號內的變量`n`是傳遞給 lambda 表達式的參數。 Lambda 主體接受參數并檢查其是偶數還是奇數。 ### 示例 4:將 lambda 表達式與參數一起使用 ```java @FunctionalInterface interface MyInterface { // abstract method String reverse(String n); } public class Main { public static void main( String[] args ) { // declare a reference to MyInterface // assign a lambda expression to the reference MyInterface ref = (str) -> { String result = ""; for (int i = str.length()-1; i >= 0 ; i--) result += str.charAt(i); return result; }; // call the method of the interface System.out.println("Lambda reversed = " + ref.reverse("Lambda")); } } ``` **輸出**: ```java Lambda reversed = adbmaL ``` * * * ## 泛型函數式接口 到目前為止,我們已經使用了僅接受一種類型的值的函數式接口。 例如, ```java @FunctionalInterface interface MyInterface { String reverseString(String n); } ``` 上面的函數式接口僅接受`String`并返回`String`。 但是,我們可以使函數式接口通用,以便接受任何數據類型。 如果您不確定泛型,請訪問 [Java 泛型](/java-programming/generics)。 ### 示例 5:泛型函數式接口和 Lambda 表達式 ```java // GenericInterface.java @FunctionalInterface interface GenericInterface<T> { // generic method T func(T t); } // GenericLambda.java public class Main { public static void main( String[] args ) { // declare a reference to GenericInterface // the GenericInterface operates on String data // assign a lambda expression to it GenericInterface<String> reverse = (str) -> { String result = ""; for (int i = str.length()-1; i >= 0 ; i--) result += str.charAt(i); return result; }; System.out.println("Lambda reversed = " + reverse.func("Lambda")); // declare another reference to GenericInterface // the GenericInterface operates on Integer data // assign a lambda expression to it GenericInterface<Integer> factorial = (n) -> { int result = 1; for (int i = 1; i <= n; i++) result = i * result; return result; }; System.out.println("factorial of 5 = " + factorial.func(5)); } } ``` **輸出**: ```java Lambda reversed = adbmaL factorial of 5 = 120 ``` 在上面的示例中,我們創建了一個名為`GenericInterface`的通用函數式接口。 它包含一個名為`func()`的通用方法。 在`Main`類里面 * `GenericInterface<String> reverse` - 創建對接口的引用。 現在,該接口可處理`String`類型的數據。 * `GenericInterface<Integer> factorial` - 創建對接口的引用。 在這種情況下,該接口對`Integer`類型的數據進行操作。 * * * ## Lambda 表達式和流 API 新的[`java.util.stream`](http://javadocs.techempower.com/jdk18/api/java/util/stream/package-summary.html)包已添加到 JDK8,它允許 Java 開發人員執行諸如`Lists`之類的搜索,過濾,映射,歸約或操作集合之類的操作。 例如,我們有一個數據流(在我們的示例中為`String`的`List`),其中每個字符串都是國家名稱和國家/地區的組合。 現在,我們可以處理此數據流,并且僅從尼泊爾檢索位置。 為此,我們可以結合使用流 API 和 Lambda 表達式在流中執行批量操作。 ### 示例 6:將 lambda 與流 API 一起使用的示例 ```java import java.util.ArrayList; import java.util.List; public class StreamMain { // create an object of list using ArrayList static List<String> places = new ArrayList<>(); // preparing our data public static List getPlaces(){ // add places and country to the list places.add("Nepal, Kathmandu"); places.add("Nepal, Pokhara"); places.add("India, Delhi"); places.add("USA, New York"); places.add("Africa, Nigeria"); return places; } public static void main( String[] args ) { List<String> myPlaces = getPlaces(); System.out.println("Places from Nepal:"); // Filter places from Nepal myPlaces.stream() .filter((p) -> p.startsWith("Nepal")) .map((p) -> p.toUpperCase()) .sorted() .forEach((p) -> System.out.println(p)); } } ``` **輸出**: ```java Places from Nepal: NEPAL, KATHMANDU NEPAL, POKHARA ``` 在上面的示例中,請注意以下語句: ```java myPlaces.stream() .filter((p) -> p.startsWith("Nepal")) .map((p) -> p.toUpperCase()) .sorted() .forEach((p) -> System.out.println(p)); ``` 在這里,我們使用的是流 API 的`filter()`,`map()`和`forEach()`之類的方法。 這些方法可以將 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>

                              哎呀哎呀视频在线观看