<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國際加速解決方案。 廣告
                2014年Java8發布,新功能是自Java1.0發布18年來最大變化的。沒有去除任何API,我們仍然能兼容以前的代碼,新功能中提供了更多的語法和設計,幫助開發者編寫更清楚、簡潔的代碼。 Java8把函數式編程里一些最好的思想融入到大家熟知的Java語法中,讓你用更少的時間寫出高效代碼。 [TOC] # 命令式編程 ***** 一般我們實現一個系統有兩種思考方式,一種專注于如何實現,比如下廚做菜,通常按照自己熟悉的烹飪方法:首先洗菜,然后切菜,熱油,下菜,然后…… 這看起來像是一系列的命令合集。 對于這種”如何做”式的編程風格我們稱之為命令式編程,它的特點非常像工廠的流水線、計算機的指令處理,都是串行化、命令式的。 ``` CookingTask cookingTask = new CookingTask(); cookingTask.wash(); cookingTask.cut(); cookingTask.deepFry(); cookingTask.fried(); ``` # 聲明式編程 ***** 還有一種方式你關注的是要做什么,我們如果用lambda和函數式來解決上述問題應該是這樣的: ``` public class CookingDemo { public void doTask(String material, Consumer<String> consumer) { consumer.accept(material); } public static void main(String[] args) { CookingDemo cookingDemo = new CookingDemo(); cookingDemo.doTask("蔬菜", material -> System.out.println("清洗" + material)); cookingDemo.doTask("蔬菜", material -> System.out.println(material + "切片")); cookingDemo.doTask("食用油", material -> System.out.println(material + "燒熱")); cookingDemo.doTask("", material -> System.out.println("炒菜")); } } ``` 這里我們將烹飪的實現細節交給了函數庫,它最大的優勢在于你讀起來就像是在問題陳述,采用這種方式我們很快可以理解它的功能,當你在烹飪流程中添加其他步驟也變得非常簡單,你只需要調用doTask方法將材料傳遞進去處理,比如在食用油燒熱前我要打個雞蛋 ``` cookingDemo.doTask("雞蛋", material -> System.out.println(material + "打碎攪拌均勻")); ``` 而不用再編寫一個處理雞蛋的方法。 # 什么是函數式編程 ***** 對于“什么是函數式編程”這一問題最簡化的回答是“它是一種使用函數進行編程的方式”。每個人的理解都是不同的,其核心是:在思考問題時,使用不可變值和函數,函數對一個值進行處理,映射成另一個值。 我們想象一下設計一個函數,輸入一個字符串類型和布爾類型參數,輸出一個整形參數。 ``` int pos = 0; public Integer foo(String str, boolea flag){ if(flag && null != str){ pos++; } return pos; } ``` 這個例子有輸入也有輸出,同時每次調用也可能會更行外部的變量值,這樣的函數我們稱之為是有副作用的函數。 在函數式編程的上下文中,一個“函數”對應于一個數學函數:它接受零個或多個參數,生成一個或多個結果,并且不會有任何副作用。 你可以把它看成一個黑盒,它接收輸入并產生一些輸出,像下面的函數 ``` public Integer foo(String str, boolea flag){ if(flag && null != str){ return 1; } return 0; } ``` 這種類型的函數和你在Java編程語言中見到的函數之間的區別是非常重要的(我們無法想象,log或者sin這樣的數學函數會有副作用)。 尤其是,使用同樣的參數調用數學函數,它所返回的結果一定是相同的。 # 函數的副作用 ***** 當談論“函數式”時,我們想說的其實是“像數學函數那樣——沒有副作用”。由此,編程上的一些精妙問題隨之而來。 我們的意思是,每個函數都只能使用函數和像if-then-else這樣的數學思想來構建嗎? 或者,我們也允許函數內部執行一些非函數式的操作,只要這些操作的結果不會暴露給系統中的其他部分? 換句話說,如果程序有一定的副作用,不過該副作用不會為其他的調用者感知,是否我們能假設這種副作用不存在呢? 調用者不需要知道,或者完全不在意這些副作用,因為這對它完全沒有影響。 當我們希望能界定這二者之間的區別時,我們將第一種稱為純粹的函數式編程,后者稱為函數式編程。 在編程實戰中我們很難用Java語言以純粹的函數式來完成一個程序的,因為很多老的代碼包括標準庫的函數都是有副作用的 (調用Scanner.nextLine就有副作用,它會從一個文件中讀取一行, 通常情況兩次調用的結果完全不同)。你希望為你的系統 編寫接近純函數式的實現,需要確保你的代碼沒有副作用。假設這樣一個函數或者方法,它沒有副作用,進入方法體執行時會對一個字段的值加一, 退出方法體之前會對該字段減一。對一個單線程的程序而言,這個方法是沒有副作用的,可以看作函數式的實現。 我們構建函數式的準則是,被稱為“函數式”的函數或方法都只能修改局部變量,除此之外,它引用的對象都應該是final的。 所有的引用類型字段都指向不可變對象。
                  <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>

                              哎呀哎呀视频在线观看