国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 > Java > java教程 > 正文

Java8中關(guān)于函數(shù)式編程的實(shí)例講解

黃舟
發(fā)布: 2017-08-09 14:03:28
原創(chuàng)
2408人瀏覽過

函數(shù)式編程,這個(gè)詞語由兩個(gè)名詞構(gòu)成,函數(shù),編程。編程這個(gè)詞我就不用解釋了,大家都是做這個(gè)的。函數(shù),其實(shí)單獨(dú)抽離出來這個(gè)詞語,也并不陌生,那二者組合后的到底是什么呢,下面這篇文章主要給大家介紹了關(guān)于java8函數(shù)式編程的相關(guān)資料,需要的朋友可以參考下。

前言

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

函數(shù)式的思考

命令式編程

立即學(xué)習(xí)Java免費(fèi)學(xué)習(xí)筆記(深入)”;

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


CookingTask cookingTask = new CookingTask();
cookingTask.wash();
cookingTask.cut();
cookingTask.deepFry();
cookingTask.fried();
...
登錄后復(fù)制

聲明式編程

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


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("炒菜"));
 }
}
登錄后復(fù)制

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


cookingDemo.doTask("雞蛋", material -> System.out.println(material + "打碎攪拌均勻"));
登錄后復(fù)制

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

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

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

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

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


int pos = 0;
public Integer foo(String str, boolea flag){
 if(flag && null != str){
  pos++;
 }
 return pos;
}
登錄后復(fù)制

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

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


public Integer foo(String str, boolea flag){
 if(flag && null != str){
  return 1;
 }
 return 0;
}
登錄后復(fù)制

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

函數(shù)的副作用

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

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

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

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

總結(jié)

以上就是Java8中關(guān)于函數(shù)式編程的實(shí)例講解的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!

豆包AI編程
豆包AI編程

智能代碼生成與優(yōu)化,高效提升開發(fā)速度與質(zhì)量!

下載
來源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn
最新問題
開源免費(fèi)商場(chǎng)系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長!
關(guān)注服務(wù)號(hào) 技術(shù)交流群
PHP中文網(wǎng)訂閱號(hào)
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時(shí)隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號(hào)
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://m.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)