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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Lambda 表達式簡介 > 原文: [https://javabeginnerstutorial.com/core-java-tutorial/introduction-lambda-expressions/](https://javabeginnerstutorial.com/core-java-tutorial/introduction-lambda-expressions/) 在本文中,我將向您簡要介紹 Java 8 的一項新功能:lambda 表達式。 我將向您展示什么是 lambda 表達式以及如何利用這一新功能。 ## 什么是 lambda 表達式? Lambda 表達式類似于其他編程語言中的閉包-或 Java 本身中的匿名函數或內部類。 Lambda 表達式希望利用匿名類的用法。 您可能還記得將操作監聽器注冊到圖形用戶界面中的按鈕的方式: ```java JButton clickMeButton = new JButton("Click me!"); clickMeButton.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent event){ System.out.println("You clicked me!"); } }); ``` 是的,上面的代碼向您展示了一個匿名內部類,該類僅用于實現`ActionListener`接口的唯一方法`actionPerformed(ActionEvent)`。 而且這很笨拙—即使現代的 IDE 可以幫助您完成代碼填充以填充方法的主體。 但是,使用 lambda 表達式,您可以像下面這樣簡單地實現此方法: ```java JButton clickMeButton = new JButton("Click me!"); clickMeButton.addActionListener(event -> System.out.println("You clicked me!")); ``` 這樣好多了,不是嗎? 現在該深入了解如何構建自己的 lambda 表達式了。 Lambda 表達式具有以下語法: ```java parameters -> expression body ``` lambda 表達式的關鍵是`->`箭頭符號。 讓我們看一個基本的示例: ```java (int x) -> { return x * x; }; ``` 還有其他一些特征可以簡化 lambda 表達式的使用: * 如果僅需要一個參數,則括號在參數周圍是可選的 * 參數的類型聲明是可選的 * `return`語句是可選的 * 表達式主體周圍的花括號是可選的—如果表達式主體包含單個語句 因為我們的簡單表達式符合上述所有四個要點,所以我們可以像這樣覆蓋 lambda 表達式: ```java x -> x * x; ``` 這使事情更具可讀性。 ## 函數式接口 Lambda 表達式可用于實現所謂的**函數式接口**的方法。 較新的接口可以帶有注解`@FunctionalInterface`,以指示此接口是函數式接口-但是,每個接口都可以視為僅具有**一個抽象方法**的函數式接口。因此,即使接口沒有被非正式地標記為`FunctionalInterface`,也可以使用 lambda 表達式替換/實現`ActionListener`的`addActionListener`。 默認方法不具有抽象性,因為它們具有實現。 如果接口在不提供實現的情況下覆蓋了`java.lang.Object`的方法,則該實現也不會被視為抽象,因為該實現將繼承`java.lang.Object`類的實現。 讓我們來看一個示例: ```java /** * @author GHajba * */ public interface ExampleFunctionalInterface { /** * @return a name */ String getName(); /** * prints a greeting */ default void printGreeting() { System.out.println("Hello " + getName() + "!"); } /** * * @return the string representation of this object */ @Override String toString(); } ``` 即使我們不添加注解,上面的接口也是一個函數式接口。 現在,我們創建一個 lambda 并使用它。 請記住,我們的 lambda 必須僅實現`getName()`函數,該函數不需要任何參數并返回`String`: ```java final ExampleFunctionalInterface example = () -> "GHajba"; // implements the getName() function example.printGreeting(); System.out.println(example); // this calls example.toString() implicitly ``` 如果運行示例,我們將得到與以下結果類似的結果: ```java Hello GHajba! ChangeCalculator$$Lambda$1/[[email?protected]](/cdn-cgi/l/email-protection) ``` 如您所見,默認方法可以與實現的 lambda 一起正常工作,并且可以從`java.lang.Object`調用`toString`,因為不存在 lambda 表達式中的直接實現。 ## 更多示例 了解了 lambda 表達式后,我們來看一些示例,在這些示例中我們可以使用它們來改進現有或新代碼。 因為 lambda 表達式是匿名函數或內部類,所以我們可以用它們替換對現有匿名函數的調用。 就像 GUI 應用的動作監聽器或`Runnable`接口的本地實現一樣。 ```java final Runnable runnable = new Runnable() { @Override public void run() { System.out.println("Hello lambdas?"); } }; runnable.run(); ``` 上面的示例使用匿名類實現`Runnable`接口。 現在來看看這個簡單的“你好 lambdas”嗎? 輸出這是要做的一些工作。 ```java final Runnable runnable_lambdas = () -> System.out.println("Hello lambdas!"); runnable_lambdas.run(); ``` 上面的代碼示例使用 lambda 表達式,并且做完全相同的事情:它輸出字符串“`Hello lambdas!`”。 到控制臺-但是無需創建匿名類來實現`Runnable`接口。 自然,此代碼僅適用于函數式接口(只有一種方法的接口)。 如您所見,也可以創建無參數的 lambda。 為此,您需要提供空括號作為參數,以表明沒有任何內容。 除此之外,lambda 表達式也是閉包。 這意味著它們是可以保存在變量中并在以后重用的函數。 如果我們看一下上一節中的示例,我們可以將其保存到一個名為`square`的變量中,并在以后重用: ```java IntUnaryOperator square = x -> x * x; ``` 要使用它,我們可以直接調用它,也可以在某些流表達式中使用它,例如`map`: ```java System.out.println(square.applyAsInt(128)); System.out.println("------"); IntStream.rangeClosed(1, 10).map(square).forEach(System.out::println); ``` 上面的代碼片段的結果是這樣的: ```java 16384 ------ 1 4 9 16 25 36 49 64 81 100 ``` ## 柯里化 柯里化是函數部分應用的名稱。 這就是說,您有一個函數,該函數需要多個參數,但是大多數參數已經為人所知,并且將保持不變-只有一個會發生變化。 而且,除了在調用函數時提供每個參數之外,還可以部分咖喱函數并設置一些默認參數。 讓我們看一下以下示例: ```java public static Function<Integer, Function<Integer, Integer>> multiply() { return x -> y -> x * y; } ``` 這段代碼創建了一個簡單的函數,將兩個`Integer`類型的變量相乘。 因為返回的函數需要兩個參數(x 和 y),所以我們可以創建這些函數的當前版本并在以后使用它們: ```java final Function<Integer, Integer> two_times = multiply().apply(2); final Function<Integer, Integer> three_times = multiply().apply(3); ``` 現在,我們對每個函數都應用了一個(變量)變量。 如果調用這些函數(應用第二個變量),我們可以看到結果表示已經應用的值: ```java System.out.println(two_times.apply(3)); // prints 6 System.out.println(three_times.apply(3)); // prints 9 ``` 每次自然地調用`apply()`有點麻煩,但是 Java 目前無法使其變得更好。 如果可以編寫以下代碼,則將是更好的語法: ```java final Function<Integer, Integer> two_times = multiply()(2) System.out.println(two_times(3)); ``` 這目前尚不起作用,但是添加到 Java 語言中將是一個不錯的語法糖。 ## 總結 如果您要實現函數式接口而無需創建和實例化實現該接口的類,那么 Lambda 表達式功能強大-主要是因為您只需要一次(例如,用作按鈕的`ActionListener`)。 我們研究了珂里化/函數部分應用,并討論了一些功能將使其更易于在 Java 中使用,并希望在將來的版本中我們可以使用它。
                  <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>

                              哎呀哎呀视频在线观看