自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Scala講座:編程的思考方法

開(kāi)發(fā) 后端
本文繼續(xù)Scala講座的第三部分內(nèi)容,即編程的思考方法,希望大家喜歡。

這篇是Scala講座第七篇的第三部分,總括了函數(shù)式編程的思考方法。

在進(jìn)行什么編程的時(shí)候,你用什么方法來(lái)思考呢?用命令是方法來(lái)考慮的話,一定是考慮“首先有一個(gè)變量,然后一邊循環(huán)一邊判斷一下這樣的條件,接著進(jìn)行這種操作···”這樣的操作步驟吧。

面向?qū)ο笫椒椒▉?lái)考慮時(shí),一定是先考慮“程序中出現(xiàn)的這個(gè)對(duì)象里有什么東西(數(shù)據(jù))呀?”,然后再給對(duì)象分配 “動(dòng)作”(方法)吧。整體印象應(yīng)該是,“對(duì)象”們互相分配好自己的工作,對(duì)象自己只做自己的工作其他的工作交給其他對(duì)象來(lái)完成,“對(duì)象”們互相合作來(lái)完成一個(gè)處理吧。即使是面向?qū)ο蟮那闆r下,對(duì)于一般語(yǔ)言來(lái)說(shuō),對(duì)象方法內(nèi)也是用命令方式來(lái)實(shí)現(xiàn)的。

那么,函數(shù)式編程該是怎樣的景象呢?函數(shù)式編程是“將函數(shù)應(yīng)用在值或者對(duì)象上”這種思考方法,也就是函數(shù)只是將值或者對(duì)象轉(zhuǎn)換成不同的別的東西。這樣說(shuō),可能函數(shù)式方法還是很難在讀者腦中浮現(xiàn),那么就以“命令型”和“函數(shù)式”兩種類型的例子為基礎(chǔ)進(jìn)行闡述吧。

[Scala講座]題目:架子上的蘋(píng)果

題目?jī)?nèi)容為模擬“架子上有100個(gè)蘋(píng)果,一個(gè)個(gè)剝皮吃掉***一個(gè)也沒(méi)有了。“這個(gè)過(guò)程。運(yùn)行結(jié)果的樣子因該如下所示:

  1. > scala AppleCounter  
  2. 99 apples on the wall.  
  3. 98 apples on the wall.  
  4. :  
  5. 2 apples on the wall.  
  6. 1 apple on the wall.  
  7. no apple on the wall. 
當(dāng)蘋(píng)果只有1或0個(gè)的時(shí)候,由于不是復(fù)數(shù)情況,所以處理方法有所不同。先用命令方式來(lái)實(shí)現(xiàn)一下。
  1. object AppleCounter{  
  2. def main(args:Array[String]):Unit = {  
  3. var appleList:List[String] = List()  
  4. for(i <- 1 to 100) {  
  5. var counter = 100 -i  
  6. if (counter == 1) appleList = appleList ::: List("1 apple on the wall.")  
  7. if (counter == 0) appleList = appleList ::: List("no apple on the wall.")  
  8. if (counter != 1 && counter != 0)  
  9. appleList = appleList ::: List(counter + " apples on the wall.")  
  10. }  
  11. appleList.foreach(x => println(x))  
  12. }  
首先準(zhǔn)備好列表變量appleList,接著做100次循環(huán)。循環(huán)中用變量counter來(lái)存放當(dāng)前所剩的蘋(píng)果數(shù),并根據(jù)該數(shù)字向例表末尾加入描述文本,其中對(duì)于1個(gè)和0個(gè)的情況進(jìn)行特殊處理。***使用appleList的foreach方法對(duì)每一列表成員進(jìn)行打印操作。題外話,由于Scala是函數(shù)式+面向?qū)ο笳Z(yǔ)言,所以能夠以這種命令式方法來(lái)編程,這對(duì)于不熟悉函數(shù)式編程的用戶來(lái)說(shuō)也還真不錯(cuò)。
好了,這次用函數(shù)式的方法來(lái)重新實(shí)現(xiàn)一下同樣的邏輯。那么該怎樣考慮函數(shù)式的實(shí)現(xiàn)呢?下面是實(shí)現(xiàn)例子。
  1. object AppleCounter {  
  2. def main(args:Array[String]):Unit = {val appleList = (0 until 100).reverse.map(x => x match {  
  3. case 1 => "1 apple on the wall." 
  4. case 0 => "no apple on the wall." 
  5. case _ => x + " apples on the wall." 
  6. })  
  7. appleList.foreach(x => println(x))  
  8. }  
這里不是想說(shuō)明“程序短了不少啊···”,而是希望大家明白思考方法的不同之處(不過(guò)這里并沒(méi)有聲明變量appleList的類型,能夠進(jìn)行如此復(fù)雜的類型推斷也真是挺厲害的呀!)。編寫(xiě)這段程序的時(shí)候,我一開(kāi)始就沒(méi)有考慮到循環(huán)這個(gè)概念。比起循環(huán),我考慮的是如何將函數(shù)用在數(shù)字列表變量上。首先不是邏輯,而是創(chuàng)建用于執(zhí)行函數(shù)的對(duì)象(這里是數(shù)字列表),然后考慮選擇哪種函數(shù)來(lái)執(zhí)行。
首先考慮創(chuàng)建如下的列表對(duì)象。
  1. List(999897, .... 210
這個(gè)通過(guò)(0 until 100).reverse部分來(lái)實(shí)現(xiàn)。接著對(duì)于這個(gè)列表的一個(gè)個(gè)數(shù)字,考慮返回?cái)?shù)字相對(duì)應(yīng)字符串的函數(shù)。對(duì)應(yīng)部分如下
  1. (上面的列表).map(x => x match {  
  2. case 1 => "1 apple on the wall." 
  3. case 0 => "no apple on the wall." 
  4. case _ => x + " apples on the wall." 
  5. }) 
用Scala進(jìn)行像樣的函數(shù)式編程時(shí),map是最重要的函數(shù)之一。也就是,對(duì)于列表中的每個(gè)元素用map函數(shù)傳進(jìn)來(lái)的函數(shù)執(zhí)行一下,然后返回他的結(jié)果列表。這里傳遞給map函數(shù)的參數(shù)(函數(shù)對(duì)象)內(nèi)容是:對(duì)于1返回1 apple on the wall.;對(duì)于0返回no apple on the wall;其他情況比如22,返回22 apples on the wall。根據(jù)該內(nèi)容,map函數(shù)返回如下列表
  1. List("99 apples on the wall.""98 apples on the wall.", …"no apple on the wall."

***一行類似于命令式編程,對(duì)于例表appleList用foreach方法循環(huán)遍歷,并用foreach傳進(jìn)的函數(shù)打印列表所有的元素,然后程序結(jié)束。
函數(shù)map不僅在List類中有,其他很多類中也有。

Scala講座 圖:map函數(shù)概念圖

Scala講座 圖:map函數(shù)概念圖 

函數(shù)式語(yǔ)言中List具有強(qiáng)大的功能,這里再一次強(qiáng)調(diào),函數(shù)式編程不是考慮如何循環(huán),而是首先考慮創(chuàng)建作為操作源的列表,然后考慮將怎樣的函數(shù)適用于列表中的元素。由于使用如此風(fēng)格的編程方式,所以就不需要保存用于循環(huán)的計(jì)數(shù)器呀,臨時(shí)變量什么的了。

Scala講座到這里,第七篇第三部分內(nèi)容就結(jié)束了。

【編輯推薦】

  1. 萬(wàn)物皆對(duì)象:介紹Scala對(duì)象
  2. Scala的泛型:***大的特性
  3. Scala的Trait:可以包含代碼的接口
  4. Scala的模式匹配和條件類
  5. Scala類:復(fù)數(shù)類,無(wú)參方法,繼承和覆蓋
責(zé)任編輯:book05 來(lái)源: JavaEye博客
相關(guān)推薦

2009-09-27 15:23:00

Scala講座函數(shù)式編程Scala

2009-12-11 10:44:00

Scala講座函數(shù) scala

2009-09-24 09:28:00

Scala講座全局變量scala

2009-08-27 10:06:15

Scala的構(gòu)造方法

2009-12-11 10:45:00

Scala講座類型系統(tǒng)功能

2009-12-11 10:42:00

Scala講座類定義構(gòu)造函數(shù)

2010-09-14 15:34:41

Scala

2009-09-27 15:29:00

Scala講座面向?qū)ο?/a>Scala

2009-12-11 10:43:00

Scala講座混入多重繼承類型層次

2009-12-11 10:43:00

Scala講座操作符函數(shù)

2010-11-17 11:31:22

Scala基礎(chǔ)面向?qū)ο?/a>Scala

2013-08-20 09:23:06

Scala遞歸

2013-11-11 09:26:50

編程思考

2010-09-14 13:22:17

Scala編程指南Scala

2009-07-21 12:18:37

ScalaRational對(duì)象toString

2013-09-12 15:51:04

編程文化垃圾代碼移動(dòng)開(kāi)發(fā)

2009-02-06 09:08:04

Scala函數(shù)語(yǔ)言輕量級(jí)

2010-07-26 08:35:06

ScalaJava

2009-09-24 09:38:00

Scala講座第一類對(duì)象scala

2010-09-14 14:28:58

Scala
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)