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

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## 新舊對比 通常,傳遞給方法的數據不同,結果不同。如果我們希望方法在調用時行為不同,該怎么做呢?結論是:只要能將代碼傳遞給方法,我們就可以控制它的行為。此前,我們通過在方法中創建包含所需行為的對象,然后將該對象傳遞給我們想要控制的方法來完成此操作。下面我們用傳統形式和 Java 8 的方法引用、Lambda 表達式分別演示。代碼示例: ~~~java // functional/Strategize.java interface Strategy { String approach(String msg); } class Soft implements Strategy { public String approach(String msg) { return msg.toLowerCase() + "?"; } } class Unrelated { static String twice(String msg) { return msg + " " + msg; } } public class Strategize { Strategy strategy; String msg; Strategize(String msg) { strategy = new Soft(); // [1] this.msg = msg; } void communicate() { System.out.println(strategy.approach(msg)); } void changeStrategy(Strategy strategy) { this.strategy = strategy; } public static void main(String[] args) { Strategy[] strategies = { new Strategy() { // [2] public String approach(String msg) { return msg.toUpperCase() + "!"; } }, msg -> msg.substring(0, 5), // [3] Unrelated::twice // [4] }; Strategize s = new Strategize("Hello there"); s.communicate(); for(Strategy newStrategy : strategies) { s.changeStrategy(newStrategy); // [5] s.communicate(); // [6] } } } ~~~ 輸出結果: ~~~ hello there? HELLO THERE! Hello Hello there Hello there ~~~ **Strategy**接口提供了單一的`approach()`方法來承載函數式功能。通過創建不同的**Strategy**對象,我們可以創建不同的行為。 我們一般通過創建一個實現**Strategy**接口的類來實現這種行為,正如在**Soft**里所做的。 * **\[1\]**在**Strategize**中,你可以看到**Soft**作為默認策略,在構造函數中賦值。 * **\[2\]**一種較為簡潔且更加自然的方法是創建一個**匿名內部類**。即便如此,仍有相當數量的冗余代碼。你總需要仔細觀察后才會發現:“哦,我明白了,原來這里使用了匿名內部類。” * **\[3\]**Java 8 的 Lambda 表達式,其參數和函數體被箭頭`->`分隔開。箭頭右側是從 Lambda 返回的表達式。它與單獨定義類和采用匿名內部類是等價的,但代碼少得多。 * **\[4\]**Java 8 的**方法引用**,它以`::`為特征。`::`的左邊是類或對象的名稱,`::`的右邊是方法的名稱,但是沒有參數列表。 * **\[5\]**在使用默認的**Soft**策略之后,我們逐步遍歷數組中的所有**Strategy**,并通過調用`changeStrategy()`方法將每個**Strategy**傳入變量`s`中。 * **\[6\]**現在,每次調用`communicate()`都會產生不同的行為,具體取決于此刻正在使用的策略**代碼對象**。我們傳遞的是行為,而并不僅僅是數據。\[^3\] 在 Java 8 之前,我們能夠通過**\[1\]**和**\[2\]**的方式傳遞功能。然而,這種語法的讀寫非常笨拙,并且我們別無選擇。方法引用和 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>

                              哎呀哎呀视频在线观看