這篇文章主要講解了“scala高階函數(shù)是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“scala高階函數(shù)是什么”吧!
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:申請域名、網(wǎng)絡(luò)空間、營銷軟件、網(wǎng)站建設(shè)、武安網(wǎng)站維護(hù)、網(wǎng)站推廣。
高階函數(shù)是指使用其他函數(shù)作為參數(shù)、或者返回一個(gè)函數(shù)作為結(jié)果的函數(shù)。在Scala中函數(shù)是“一等公民”,所以允許定義高階函數(shù)。這里的術(shù)語可能有點(diǎn)讓人困惑,我們約定,使用函數(shù)值作為參數(shù),或者返回值為函數(shù)值的“函數(shù)”和“方法”,均稱之為“高階函數(shù)”。
最常見的一個(gè)例子是Scala集合類(collections)的高階函數(shù)map
val salaries = Seq(20000, 70000, 40000)val doubleSalary = (x: Int) => x * 2val newSalaries = salaries.map(doubleSalary)
函數(shù)doubleSalary
有一個(gè)整型參數(shù)x
,返回x * 2
。一般來說,在=>
左邊的元組是函數(shù)的參數(shù)列表,而右邊表達(dá)式的值則為函數(shù)的返回值。在第3行,函數(shù)doubleSalary
被應(yīng)用在列表salaries
中的每一個(gè)元素。
為了簡化壓縮代碼,我們可以使用匿名函數(shù),直接作為參數(shù)傳遞給map
:
val salaries = Seq(20000, 70000, 40000)val newSalaries = salaries.map(x => x * 2)
注意在上述示例中x
沒有被顯式聲明為Int類型,這是因?yàn)榫幾g器能夠根據(jù)map函數(shù)期望的類型推斷出x
的類型。對于上述代碼,一種更慣用的寫法為:
val salaries = Seq(20000, 70000, 40000)val newSalaries = salaries.map(_ * 2)
既然Scala編譯器已經(jīng)知道了參數(shù)的類型(一個(gè)單獨(dú)的Int),你可以只給出函數(shù)的右半部分,不過需要使用_
代替參數(shù)名(在上一個(gè)例子中是x
)
你同樣可以傳入一個(gè)對象方法作為高階函數(shù)的參數(shù),這是因?yàn)镾cala編譯器會將方法強(qiáng)制轉(zhuǎn)換為一個(gè)函數(shù)。
case class WeeklyWeatherForecast(temperatures: Seq[Double]) {
private def convertCtoF(temp: Double) = temp * 1.8 + 32
def forecastInFahrenheit: Seq[Double] = temperatures.map(convertCtoF)
}
在這個(gè)例子中,方法convertCtoF
被傳入forecastInFahrenheit
。這是可以的,因?yàn)榫幾g器強(qiáng)制將方法convertCtoF
轉(zhuǎn)成了函數(shù)x => convertCtoF(x)
(注: x
是編譯器生成的變量名,保證在其作用域是唯一的)。
使用高階函數(shù)的一個(gè)原因是減少冗余的代碼。比方說需要寫幾個(gè)方法以通過不同方式來提升員工工資,若不使用高階函數(shù),代碼可能像這樣:
object SalaryRaiser {
def smallPromotion(salaries: List[Double]): List[Double] =
salaries.map(salary => salary * 1.1)
def greatPromotion(salaries: List[Double]): List[Double] =
salaries.map(salary => salary * math.log(salary))
def hugePromotion(salaries: List[Double]): List[Double] =
salaries.map(salary => salary * salary)
}
注意這三個(gè)方法的差異僅僅是提升的比例不同,為了簡化代碼,其實(shí)可以把重復(fù)的代碼提到一個(gè)高階函數(shù)中:
object SalaryRaiser {
private def promotion(salaries: List[Double], promotionFunction: Double => Double): List[Double] =
salaries.map(promotionFunction)
def smallPromotion(salaries: List[Double]): List[Double] =
promotion(salaries, salary => salary * 1.1)
def bigPromotion(salaries: List[Double]): List[Double] =
promotion(salaries, salary => salary * math.log(salary))
def hugePromotion(salaries: List[Double]): List[Double] =
promotion(salaries, salary => salary * salary)
}
新的方法promotion
有兩個(gè)參數(shù),薪資列表和一個(gè)類型為Double => Double
的函數(shù)(參數(shù)和返回值類型均為Double),返回薪資提升的結(jié)果。
有一些情況你希望生成一個(gè)函數(shù), 比如:
def urlBuilder(ssl: Boolean, domainName: String): (String, String) => String = {
val schema = if (ssl) "https://" else "http://"
(endpoint: String, query: String) => s"$schema$domainName/$endpoint?$query"
}
val domainName = "www.example.com"
def getURL = urlBuilder(ssl=true, domainName)
val endpoint = "users"
val query = "id=1"
val url = getURL(endpoint, query)
注意urlBuilder的返回類型是(String, String) => String
,這意味著返回的匿名函數(shù)有兩個(gè)String參數(shù),返回一個(gè)String。在這個(gè)例子中,返回的匿名函數(shù)是
(endpoint: String, query: String) => s"https://www.example.com/$endpoint?$query"。
感謝各位的閱讀,以上就是“scala高階函數(shù)是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對scala高階函數(shù)是什么這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!