真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

scala高階函數(shù)是什么

這篇文章主要講解了“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

強(qiáng)制轉(zhuǎn)換方法為函數(shù)

你同樣可以傳入一個(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ù)作為參數(shù)的函數(shù)

使用高階函數(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é)果。

返回函數(shù)的函數(shù)

有一些情況你希望生成一個(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)注!


分享標(biāo)題:scala高階函數(shù)是什么
文章來源:http://weahome.cn/article/jdssoi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部