最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8深入學習系列(二)函數(shù)式編程

 更新時間:2017年08月09日 10:37:03   作者:王爵nice  
函數(shù)式編程,這個詞語由兩個名詞構成,函數(shù),編程。編程這個詞我就不用解釋了,大家都是做這個的。函數(shù),其實單獨抽離出來這個詞語,也并不陌生,那二者組合后的到底是什么呢,下面這篇文章主要給大家介紹了關于Java8函數(shù)式編程的相關資料,需要的朋友可以參考下。

前言

在之前的一篇文章中我們快速學習了lambda和Stream,本章節(jié)中我們來回顧和理解函數(shù)式編程的思想。 我們不斷的提及函數(shù)式這個名詞,它指的是lambda嗎?如果是這樣,采用函數(shù)式編程能為你帶來什么好處呢?


函數(shù)式的思考

命令式編程

一般我們實現(xiàn)一個系統(tǒng)有兩種思考方式,一種專注于如何實現(xiàn),比如下廚做菜,通常按照自己熟悉的烹飪方法:首先洗菜, 然后切菜,熱油,下菜,然后…… 這看起來像是一系列的命令合集。對于這種”如何做”式的編程風格我們稱之為命令式編程, 它的特點非常像工廠的流水線、計算機的指令處理,都是串行化、命令式的。

CookingTask cookingTask = new CookingTask();
cookingTask.wash();
cookingTask.cut();
cookingTask.deepFry();
cookingTask.fried();
...

聲明式編程

還有一種方式你關注的是要做什么,我們?nèi)绻胠ambda和函數(shù)式來解決上述問題應該是這樣的:

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("炒菜"));
 }
}

這里我們將烹飪的實現(xiàn)細節(jié)交給了函數(shù)庫,它最大的優(yōu)勢在于你讀起來就像是在問題陳述,采用這種方式我們很快可以理解它的功能, 當你在烹飪流程中添加其他步驟也變得非常簡單,你只需要調(diào)用doTask方法將材料傳遞進去處理,比如在食用油燒熱前我要打個雞蛋

cookingDemo.doTask("雞蛋", material -> System.out.println(material + "打碎攪拌均勻"));

而不用再編寫一個處理雞蛋的方法。

什么是函數(shù)式編程

對于“什么是函數(shù)式編程”這一問題最簡化的回答是“它是一種使用函數(shù)進行編程的方式”。 每個人的理解都是不同的,其核心是:在思考問題時,使用不可變值和函數(shù),函數(shù)對一個值進行處理,映射成另一個值。

不同的語言社區(qū)往往對各自語言中的特性孤芳自賞。現(xiàn)在談Java程序員如何定義函數(shù)式編程還為時尚早, 但是,這根本不重要!我們關心的是如何寫出好代碼,而不是符合函數(shù)式編程風格的代碼。

我們想象一下設計一個函數(shù),輸入一個字符串類型和布爾類型參數(shù),輸出一個整形參數(shù)。

int pos = 0;
public Integer foo(String str, boolea flag){
 if(flag && null != str){
  pos++;
 }
 return pos;
}

這個例子有輸入也有輸出,同時每次調(diào)用也可能會更行外部的變量值,這樣的函數(shù)我們稱之為是有副作用的函數(shù)。

在函數(shù)式編程的上下文中,一個“函數(shù)”對應于一個數(shù)學函數(shù):它接受零個或多個參數(shù),生成一個或多個結果,并且不會有任何副作用。 你可以把它看成一個黑盒,它接收輸入并產(chǎn)生一些輸出,像下面的函數(shù)

public Integer foo(String str, boolea flag){
 if(flag && null != str){
  return 1;
 }
 return 0;
}

這種類型的函數(shù)和你在Java編程語言中見到的函數(shù)之間的區(qū)別是非常重要的(我們無法想象,log或者sin這樣的數(shù)學函數(shù)會有副作用)。 尤其是,使用同樣的參數(shù)調(diào)用數(shù)學函數(shù),它所返回的結果一定是相同的。這里,我們暫時不考慮Random.nextInt這樣的方法,

函數(shù)的副作用

當談論“函數(shù)式”時,我們想說的其實是“像數(shù)學函數(shù)那樣——沒有副作用”。由此,編程上的一些精妙問題隨之而來。 我們的意思是,每個函數(shù)都只能使用函數(shù)和像if-then-else這樣的數(shù)學思想來構建嗎? 或者,我們也允許函數(shù)內(nèi)部執(zhí)行一些非函數(shù)式的操作,只要這些操作的結果不會暴露給系統(tǒng)中的其他部分? 換句話說,如果程序有一定的副作用,不過該副作用不會為其他的調(diào)用者感知,是否我們能假設這種副作用不存在呢? 調(diào)用者不需要知道,或者完全不在意這些副作用,因為這對它完全沒有影響。

當我們希望能界定這二者之間的區(qū)別時,我們將第一種稱為純粹的函數(shù)式編程,后者稱為函數(shù)式編程。

在編程實戰(zhàn)中我們很難用Java語言以純粹的函數(shù)式來完成一個程序的,因為很多老的代碼包括標準庫的函數(shù)都是有副作用的 (調(diào)用Scanner.nextLine就有副作用,它會從一個文件中讀取一行, 通常情況兩次調(diào)用的結果完全不同)。你希望為你的系統(tǒng) 編寫接近純函數(shù)式的實現(xiàn),需要確保你的代碼沒有副作用。假設這樣一個函數(shù)或者方法,它沒有副作用,進入方法體執(zhí)行時會對一個字段的值加一, 退出方法體之前會對該字段減一。對一個單線程的程序而言,這個方法是沒有副作用的,可以看作函數(shù)式的實現(xiàn)。

我們構建函數(shù)式的準則是,被稱為“函數(shù)式”的函數(shù)或方法都只能修改局部變量,除此之外,它引用的對象都應該是final的。 所有的引用類型字段都指向不可變對象。

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者使用java8能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • SpringBoot獲取客戶端的IP地址的實現(xiàn)示例

    SpringBoot獲取客戶端的IP地址的實現(xiàn)示例

    在Web應用程序中,獲取客戶端的IP地址是一項非常常見的需求,本文主要介紹了SpringBoot獲取客戶端的IP地址的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • java String拼接時的問題匯總

    java String拼接時的問題匯總

    在本篇文章里小編給大家整理的是關于java String拼接時的問題匯總,有需要的朋友們可以參考下。
    2020-02-02
  • java如何創(chuàng)建一個jdbc程序詳解

    java如何創(chuàng)建一個jdbc程序詳解

    使用Java程序來操作數(shù)據(jù)庫,后者更加直接的話就是使用Java程序來發(fā)送SQL語句的技術稱之為:JDBC。下面這篇文章主要給大家介紹了關于利用java如何創(chuàng)建一個jdbc程序的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-11-11
  • Spring Boot的Profile配置詳解

    Spring Boot的Profile配置詳解

    本篇文章主要介紹了Spring Boot的Profile配置詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java實現(xiàn)Dbhelper支持大數(shù)據(jù)增刪改

    Java實現(xiàn)Dbhelper支持大數(shù)據(jù)增刪改

    這篇文章主要介紹了Java實現(xiàn)Dbhelper支持大數(shù)據(jù)增刪改功能的實現(xiàn)過程,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Java使用BigDecimal精確運算浮點數(shù)

    Java使用BigDecimal精確運算浮點數(shù)

    這篇文章主要介紹了Java使用BigDecimal精確運算浮點數(shù),幫助大家更好的處理浮點數(shù)數(shù)據(jù),感興趣的朋友可以了解下
    2020-10-10
  • 解決Springboot啟動報錯:類文件具有錯誤的版本61.0,應為?52.0

    解決Springboot啟動報錯:類文件具有錯誤的版本61.0,應為?52.0

    這篇文章主要給大家介紹了關于解決Springboot啟動報錯:類文件具有錯誤的版本?61.0,應為?52.0的相關資料,這是查閱了網(wǎng)上的很多資料才解決的,分享給大家,需要的朋友可以參考下
    2023-01-01
  • Spring注解實現(xiàn)自動裝配過程解析

    Spring注解實現(xiàn)自動裝配過程解析

    這篇文章主要介紹了Spring注解實現(xiàn)自動裝配過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • Spring?IOC容器Bean注解創(chuàng)建對象組件掃描

    Spring?IOC容器Bean注解創(chuàng)建對象組件掃描

    這篇文章主要為大家介紹了Spring?IOC容器Bean注解創(chuàng)建對象組件掃描,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • MyBatis中一級緩存和二級緩存的區(qū)別

    MyBatis中一級緩存和二級緩存的區(qū)別

    MyBatis提供了兩級緩存機制,一級緩存和二級緩存,本文主要介紹了MyBatis中一級緩存和二級緩存的區(qū)別,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07

最新評論

南溪县| 大足县| 石门县| 九龙城区| 老河口市| 武宣县| 普安县| 奎屯市| 四会市| 根河市| 江阴市| 仁化县| 乌审旗| 洪江市| 宜宾市| 道孚县| 大渡口区| 大埔县| 米林县| 苏州市| 渑池县| 广水市| 纳雍县| 肃宁县| 澄城县| 曲松县| 平武县| 柘荣县| 鄂尔多斯市| 尚志市| 石渠县| 沛县| 手游| 威信县| 嘉兴市| 姜堰市| 温泉县| 黄浦区| 西华县| 宜君县| 吐鲁番市|