鍍金池/ 教程/ Scala/ 函數(shù)–函數(shù)字面量的一些簡化寫法
包對象
Ordered Trait
組合和繼承–定義 final 成員
基本數(shù)據(jù)類型
Match 表達(dá)式
類和對象 (三)
操作基本數(shù)據(jù)類型
for 表達(dá)式
組合和繼承–重載成員函數(shù)和方法
類和對象 (二)
組合和繼承–定義 factory 對象
組合和繼承–多態(tài)和動態(tài)綁定
Trait 的基本概念
if 表達(dá)式
組合和繼承–抽象類
函數(shù)–函數(shù)字面量的一些簡化寫法
while 循環(huán)
組合和繼承–使用組合還是繼承?
訪問控制修飾符
Trait 示例–Rectangular 對象
組合和繼承–定義參數(shù)化成員變量
組合和繼承–定義無參數(shù)方法
類和對象 (一)
函數(shù)–閉包
函數(shù)–類成員函數(shù)
Scala 基本數(shù)據(jù)類型的實(shí)現(xiàn)方法
try 表達(dá)式處理異常
選擇瘦接口還是胖接口設(shè)計(jì)?
組合和繼承–小結(jié)
創(chuàng)建新的控制結(jié)構(gòu)
使用 import
為訪問控制修飾符添加作用域
Scala 的類層次關(guān)系
類和對象 (五)
傳名參數(shù)
柯里化函數(shù)
函數(shù)–頭等公民
組合和組合和繼承–定義 heighten 和 widen 函數(shù)
使用 Package–將代碼放入包中
隱含的 import
所有類的公共子類–底層類型
進(jìn)一步 Scala
函數(shù)–局部函數(shù)
引用包中的代碼
組合和繼承–使用 override 修飾符
組合和繼承–實(shí)現(xiàn)類 Element 的 above,beside 和 toString()方法
類和對象 (四)
函數(shù)–尾遞歸
沒有“break”和“continue”的日子
組合和繼承–調(diào)用基類構(gòu)造函數(shù)
減低代碼重復(fù)
函數(shù)–函數(shù)–可變參數(shù),命名參數(shù),缺省參數(shù)
起步 Scala
組合和繼承–擴(kuò)展類
函數(shù)–部分應(yīng)用的函數(shù)
開始神奇的 Scala編程之旅
組合和繼承–概述
Trait 用來實(shí)現(xiàn)可疊加的修改操作

函數(shù)–函數(shù)字面量的一些簡化寫法

Scala 提供了多種方法來簡化函數(shù)字面量中多余的部分,比如前面例子中 filter 方法中使用的函數(shù)字面量,完整的寫法如下:

 (x :Int ) => x +1

首先可以省略到參數(shù)的類型,Scala 可以根據(jù)上下文推算出參數(shù)的類型,函數(shù)定義可以簡化為:

 (x) => x +1

這個(gè)函數(shù)可以進(jìn)一步去掉參數(shù)的括號,這里的括號不起什么作用:

 x => x +1

Scala 還可以進(jìn)一步簡化,Scala 允許使用“占位符”下劃線”_”來替代一個(gè)或多個(gè)參數(shù),只要這個(gè)參數(shù)值函數(shù)定義中只出現(xiàn)一次,Scala編譯器可以推斷出參數(shù)。比如:

scala> val someNumbers = List ( -11, -10, - 5, 0, 5, 10)
someNumbers: List[Int] = List(-11, -10, -5, 0, 5, 10)
scala> someNumbers.filter(_ >0)
res0: List[Int] = List(5, 10)

可以看到簡化后的函數(shù)定義為 > 0,你可以這樣來理解,就像我們以前做過的填空題,“”為要填的空,Scala 來完成這個(gè)填空題,你來定義填空題。

有時(shí),如果你使用_來定義函數(shù),可能沒有提供足夠的信息給 Scala 編譯器,此時(shí) Scala 編譯器將會報(bào)錯(cuò),比如,定義一個(gè)加法函數(shù)如下:

scala> val f = _ + _
<console>:7: error: missing parameter type for expanded function ((x$1, x$2) => x$1.$plus(x$2))
       val f = _ + _
               ^
<console>:7: error: missing parameter type for expanded function ((x$1: <error>, x$2) => x$1.$plus(x$2))
       val f = _ + _

Scala 編譯器無法推斷出_的參數(shù)類型,就報(bào)錯(cuò)了,但如果你給出參數(shù)的類型,依然可以使用_來定義函數(shù),比如:

scala> val f = (_ :Int ) + ( _ :Int)
f: (Int, Int) => Int = <function2>
scala> f (5,10)
res1: Int = 15

因?yàn)?em>替代的參數(shù)在函數(shù)體中只能出現(xiàn)一次,因此多個(gè)“_”代表多個(gè)參數(shù)。第一個(gè)“_”代表第一個(gè)參數(shù),第二個(gè)“\”代表第二個(gè)參數(shù),以此類推。