一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java8深入學習系列(二)函數式編程

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

2020-12-13 18:42王爵nice Java教程

函數式編程,這個詞語由兩個名詞構成,函數,編程。編程這個詞我就不用解釋了,大家都是做這個的。函數,其實單獨抽離出來這個詞語,也并不陌生,那二者組合后的到底是什么呢,下面這篇文章主要給大家介紹了關于Java8函數

前言

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

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

函數式的思考

命令式編程

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

?
1
2
3
4
5
6
CookingTask cookingTask = new CookingTask();
cookingTask.wash();
cookingTask.cut();
cookingTask.deepFry();
cookingTask.fried();
...

聲明式編程

還有一種方式你關注的是要做什么,我們如果用lambda和函數式來解決上述問題應該是這樣的:

?
1
2
3
4
5
6
7
8
9
10
11
12
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方法將材料傳遞進去處理,比如在食用油燒熱前我要打個雞蛋

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

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

什么是函數式編程

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

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

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

?
1
2
3
4
5
6
7
int pos = 0;
public Integer foo(String str, boolea flag){
 if(flag && null != str){
  pos++;
 }
 return pos;
}

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

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

?
1
2
3
4
5
6
public Integer foo(String str, boolea flag){
 if(flag && null != str){
  return 1;
 }
 return 0;
}

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

函數的副作用

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

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

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

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

總結

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

原文鏈接:http://biezhi.me/2017/07/19/keep-up-with-java8-functional-programming.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99热精品在线播放 | 调教全程肉动画片在线观看 | 四虎影视地址 | 成人影院在线观看 | 丝袜捆绑调教视频免费区 | 欧美日韩一级视频 | 人人做人人爽人人爱 | 亚洲天堂视频在线观看 | 精品国产一区二区三区在线 | 草莓香蕉绿巨人丝瓜榴莲污在线观看 | 9久热这里只有精品视频在线观看 | 91制片厂制作果冻传媒八夷 | 亚洲精品视频免费在线观看 | 手机在线免费观看高清 | 久久精品久久久久 | 韩国三级在线 | 护士xxxx | 精品卡1卡2卡三卡免费视频 | 欧美黑人一级 | 国产欧美日韩精品一区二 | 晓雪老师我要进你里面好爽 | 国产精品原创永久在线观看 | 亚洲 综合 自拍 精品 在线 | 高h折磨调教古代 | 日本xxxxxxxxx高清hd| 亚洲国产精品第一页 | 国产成人免费高清激情明星 | ysl千人千色t9t9t9 | 荡娃艳妇系列小说 | 午夜福利院电影 | 免费一区二区 | 美女扒开腿让男生桶爽漫画 | 免费看一级毛片 | 香蕉精品 | 亚洲成年人免费网站 | 成人在线视频播放 | 高清视频在线播放 | 邪恶肉肉全彩色无遮盖 | 日本中文字幕在线视频 | 国产日韩欧美综合一区二区三区 | 青青青久久久 |