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

介紹Scala的第一類(lèi)函數(shù)

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

Scala擁有***類(lèi)函數(shù):first-class function。你不僅可以定義函數(shù)和調(diào)用它們,還可以把函數(shù)寫(xiě)成沒(méi)有名字的文本:literal并把它們像值:value那樣傳遞。我們?cè)诘?章介紹了函數(shù)文本并在第42頁(yè)的圖2.2里展示了基本語(yǔ)法。

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

函數(shù)文本被編譯進(jìn)一個(gè)類(lèi),類(lèi)在運(yùn)行期實(shí)例化的時(shí)候是一個(gè)函數(shù)值:function value。任何函數(shù)值都是某個(gè)擴(kuò)展了若干scala包的FunctionN特質(zhì)之一的類(lèi)的實(shí)例,如Function0是沒(méi)有參數(shù)的函數(shù),F(xiàn)unction1是有一個(gè)參數(shù)的函數(shù)等等。每個(gè)FunctionN特質(zhì)有一個(gè)apply方法用來(lái)調(diào)用函數(shù)。因此函數(shù)文本和值的區(qū)別在于函數(shù)文本存在于源代碼,而函數(shù)值存在于運(yùn)行期對(duì)象。這個(gè)區(qū)別很像類(lèi)(源代碼)和對(duì)象(運(yùn)行期)的那樣。

以下是對(duì)數(shù)執(zhí)行遞增操作的函數(shù)文本的簡(jiǎn)單例子:

  1. (x: Int) => x + 1 
=>指明這個(gè)函數(shù)把左邊的東西(任何整數(shù)x)轉(zhuǎn)變成右邊的東西(x + 1)。所以,這是一個(gè)把任何整數(shù)x映射為x + 1的函數(shù)。

函數(shù)值是對(duì)象,所以如果你愿意可以把它們存入變量。它們也是函數(shù),所以你可以使用通常的括號(hào)函數(shù)調(diào)用寫(xiě)法調(diào)用它們。以下是這兩種動(dòng)作的例子:

  1. scala> var increase = (x: Int) => x + 1 
  2. increase: (Int) => Int = < function>  
  3. scala> increase(10)  
  4. res0: Int = 11 
本例中,因?yàn)閕ncrease是var,你可以在之后重新賦給它不同的函數(shù)值。

  1. scala> increase = (x: Int) => x + 9999 
  2. increase: (Int) => Int = < function>  
  3. scala> increase(10)  
  4. res2: Int = 10009 
如果你想在函數(shù)文本中包括超過(guò)一個(gè)語(yǔ)句,用大括號(hào)包住函數(shù)體,一行放一個(gè)語(yǔ)句,就組成了一個(gè)代碼塊。與方法一樣,當(dāng)函數(shù)值被調(diào)用時(shí),所有的語(yǔ)句將被執(zhí)行,而函數(shù)的返回值就是***一行產(chǎn)生的那個(gè)表達(dá)式。

  1. scala> increase = (x: Int) => {  
  2.         println("We")  
  3.         println("are")  
  4.         println("here!")  
  5.         x + 1 
  6.        }  
  7. increase: (Int) => Int = < function>  
  8. scala> increase(10)  
  9. We  
  10. are  
  11. here!  
  12. res4: Int = 11 
于是現(xiàn)在你已經(jīng)看到了有如螺絲和螺帽的函數(shù)文本和函數(shù)值。許多Scala庫(kù)給你使用它們的機(jī)會(huì)。例如,所有的集合類(lèi)都能用到foreach方法。foreach方法被定義在特質(zhì)Iterable中,它是List,Set,Array,還有Map的共有超特質(zhì)。它帶一個(gè)函數(shù)做參數(shù),并對(duì)每個(gè)元素調(diào)用該函數(shù)。下面是如何用它打印輸出所有列表元素的代碼:

  1. scala> val someNumbers = List(-11, -10, -50510)  
  2. someNumbers: List[Int] = List(-11, -10, -50510)  
  3. scala> someNumbers.foreach((x: Int) => println(x))  
  4. -11 
  5. -10 
  6. -5 
  7. 0 
  8. 5 
  9. 10 
另一個(gè)例子是,集合類(lèi)型還有filter方法。這個(gè)方法選擇集合類(lèi)型里可以通過(guò)用戶提供的測(cè)試的元素。測(cè)試是通過(guò)函數(shù)的使用來(lái)提供的。例如,函數(shù)(x: Int) => x > 0可以被用作過(guò)濾。這個(gè)函數(shù)映射正整數(shù)為真,其它為假。下面說(shuō)明如何把它用作filter:

  1. scala> someNumbers.filter((x: Int) => x > 0)  
  2. res6: List[Int] = List(510)  

像foreach和filter這樣的方法將在本書(shū)后面描述。

【相關(guān)閱讀】

  1. Scala的本地函數(shù):將私有方法轉(zhuǎn)換為本地方法
  2. Scala中定義函數(shù)的方法:method
  3. 繼續(xù)領(lǐng)悟函數(shù)式:Scala指令式風(fēng)格代碼的重構(gòu)
  4. 學(xué)習(xí)Scala的變量范圍
  5. Scala:match表達(dá)式、break和continue

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

2009-09-24 09:38:00

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

2010-01-19 09:50:54

Java 7閉包

2009-12-11 10:42:00

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

2015-05-27 10:21:55

光纖光通信

2010-02-25 16:00:23

驅(qū)動(dòng)程序

2010-02-02 10:33:51

Python

2009-06-17 11:58:19

Linux

2009-07-22 07:42:00

Scala偏應(yīng)用函數(shù)

2017-03-07 15:13:28

Scala偏函數(shù)函數(shù)

2009-08-04 15:58:06

ASP.NET動(dòng)態(tài)控件

2021-04-20 09:44:42

CSS函數(shù)選擇器

2009-07-30 13:21:17

Scala入門(mén)Hello World

2009-07-22 07:53:00

Scala擴(kuò)展類(lèi)

2009-07-08 15:35:18

Case類(lèi)Scala

2009-07-22 07:57:00

ScalaCurry化函數(shù)

2009-06-16 17:54:38

Scala類(lèi)語(yǔ)法語(yǔ)義

2009-07-22 09:31:59

Scala類(lèi)類(lèi)層級(jí)Java類(lèi)

2011-06-28 11:06:16

Scala

2009-09-09 11:37:08

Scala的模式匹配

2009-07-21 17:21:57

Scala定義函數(shù)
點(diǎn)贊
收藏

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