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

Scala學(xué)習(xí):簡(jiǎn)化客戶代碼

開發(fā) 后端
本文節(jié)選自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻譯的《Programming in Scala》的第九章。Scala是一種針對(duì) JVM 將函數(shù)和面向?qū)ο蠹夹g(shù)組合在一起的編程語(yǔ)言。

9.2 前一個(gè)例子演示了高階函數(shù)能在你實(shí)現(xiàn)API的時(shí)候幫助減少代碼重復(fù)。高階函數(shù)的另一個(gè)重要應(yīng)用是把它們放在API里使客戶代碼更簡(jiǎn)潔。Scala的集合類型的特定用途循環(huán)方法提供了一個(gè)很好的例子。這些特定用途循環(huán)方法被定義在特質(zhì)Iterable中,被List,Set,Array,還有Map擴(kuò)展。很多已經(jīng)在第三章的表格3.1中列了出來(lái)。不過(guò)現(xiàn)在請(qǐng)注意其中的一個(gè)例子來(lái)看看為什么這些方法如此有用。

51CTO編輯推薦:Scala編程語(yǔ)言專題

考慮exists,一個(gè)判斷傳入的值是否包含在集合中的方法。當(dāng)然你也可以初始化一個(gè)var為假,循環(huán)遍歷集合類型,檢查每個(gè)元素,并且如果你找到了要尋找的就把var設(shè)置為真,通過(guò)這樣的方式尋找元素。以下是使用了這種方式的方法去判斷是否傳入的List包含了負(fù)數(shù)的例子:

  1. def containsNeg(nums: List[Int]): Boolean = {  
  2.  var exists = false 
  3.  for (num < - nums)  
  4.   if (num <  0)  
  5.    exists = true 
  6.  exists  
  7. }  
假如你在解釋器里定義了這個(gè)方法,你就可以這樣調(diào)用:

  1. scala> containsNeg(List(1234))  
  2. res0: Boolean = false 
  3. scala> containsNeg(List(123, -4))  
  4. res1: Boolean = true 
不過(guò)更簡(jiǎn)潔的定義這個(gè)方法的方式是通過(guò)在傳入的List上調(diào)用高階函數(shù)exists,如:

  1. def containsNeg(nums: List[Int]) = nums.exists(_ <  0)  
這個(gè)版本的containsNeg能產(chǎn)生和前面的那個(gè)一樣的結(jié)果:

  1. scala> containsNeg(Nil)  
  2. res2: Boolean = false 
  3. scala> containsNeg(List(01, -2))  
  4. res3: Boolean = true 
exists方法代表了控制抽象。是Scala庫(kù)提供的特定用途循環(huán)架構(gòu)而不是像while或for那樣內(nèi)建在Scala語(yǔ)言里的。上節(jié)中,高階函數(shù),filesMatching在對(duì)象FileMatcher的實(shí)現(xiàn)中減少了代碼重復(fù)。exists方法提供了類似的好處,但因?yàn)閑xists是公開在Scala的集合類型API里的,所以它減少的是API的客戶代碼中的重復(fù)。exists不存在的話,如果你想要寫一個(gè)containsOdd方法,檢測(cè)列表是否包含了奇數(shù),你或許會(huì)寫成這樣:

  1. def containsOdd(nums: List[Int]): Boolean = {  
  2.  var exists = false 
  3.  for (num < - nums)  
  4.   if (num % 2 == 1)  
  5.    exists = true 
  6.  exists  
  7. }  
若你比較了containsNeg和containsOdd的函數(shù)體,你會(huì)發(fā)現(xiàn)除了if表達(dá)式之外,其它東西都是重復(fù)的。使用exists,你就可以這么寫:

  1. def containsOdd(nums: List[Int]) = nums.exists(_ % 2 == 1
這個(gè)版本的代碼體再一次與相應(yīng)的containsNeg方法的保持一致(使用了exists的版本),除了搜索的條件不同。然而代碼重復(fù)的量卻少得多,因?yàn)樗械难h(huán)架構(gòu)都被提取成exists方法本身了。

Scala的標(biāo)準(zhǔn)庫(kù)中還有許多其他循環(huán)方法。如果你能發(fā)現(xiàn)使用它們的機(jī)會(huì),那么像exists一樣,它們經(jīng)常能縮短你的代碼。

【相關(guān)閱讀】

  1. 減少Scala中的代碼重復(fù)
  2. Scala:尾遞歸的跟蹤調(diào)用及其局限
  3. Scala允許的重復(fù)參數(shù)
  4. 學(xué)習(xí)Scala的閉包
  5. Scala的偏應(yīng)用函數(shù)

責(zé)任編輯:book05 來(lái)源: Artima
相關(guān)推薦

2009-06-22 14:26:12

ScalaXML對(duì)象

2009-02-05 17:28:01

ScalaFriendFeedXML

2009-11-16 17:04:46

Inside Scal

2009-07-21 16:58:31

Scala變量范圍

2010-08-23 10:59:02

SAP金融服務(wù)CRM

2009-07-22 07:43:00

Scala閉包

2017-04-19 08:47:42

AsyncJavascript異步代碼

2021-03-10 09:20:31

await代碼前端

2009-09-28 11:42:21

KestrelScala

2009-07-22 07:45:00

Scala代碼重復(fù)

2009-07-22 09:02:45

Scala組合繼承

2009-07-08 15:35:18

Case類Scala

2009-07-22 07:57:00

ScalaCurry化函數(shù)

2009-07-06 15:20:30

JSP表達(dá)式

2010-05-24 18:05:43

惠普云計(jì)算IT管理

2014-12-25 13:18:39

2010-05-25 15:07:37

惠普云計(jì)算簡(jiǎn)化

2011-05-07 14:53:49

2009-09-28 10:26:12

Scala代碼實(shí)例Kestrel

2009-07-22 09:22:20

Scala工廠對(duì)象
點(diǎn)贊
收藏

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