您好,登錄后才能下訂單哦!
這篇文章主要講解了“scala高階函數是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“scala高階函數是什么”吧!
高階函數是指使用其他函數作為參數、或者返回一個函數作為結果的函數。在Scala中函數是“一等公民”,所以允許定義高階函數。這里的術語可能有點讓人困惑,我們約定,使用函數值作為參數,或者返回值為函數值的“函數”和“方法”,均稱之為“高階函數”。
最常見的一個例子是Scala集合類(collections)的高階函數map
val salaries = Seq(20000, 70000, 40000)val doubleSalary = (x: Int) => x * 2val newSalaries = salaries.map(doubleSalary)
函數doubleSalary
有一個整型參數x
,返回x * 2
。一般來說,在=>
左邊的元組是函數的參數列表,而右邊表達式的值則為函數的返回值。在第3行,函數doubleSalary
被應用在列表salaries
中的每一個元素。
為了簡化壓縮代碼,我們可以使用匿名函數,直接作為參數傳遞給map
:
val salaries = Seq(20000, 70000, 40000)val newSalaries = salaries.map(x => x * 2)
注意在上述示例中x
沒有被顯式聲明為Int類型,這是因為編譯器能夠根據map函數期望的類型推斷出x
的類型。對于上述代碼,一種更慣用的寫法為:
val salaries = Seq(20000, 70000, 40000)val newSalaries = salaries.map(_ * 2)
既然Scala編譯器已經知道了參數的類型(一個單獨的Int),你可以只給出函數的右半部分,不過需要使用_
代替參數名(在上一個例子中是x
)
你同樣可以傳入一個對象方法作為高階函數的參數,這是因為Scala編譯器會將方法強制轉換為一個函數。
case class WeeklyWeatherForecast(temperatures: Seq[Double]) {
private def convertCtoF(temp: Double) = temp * 1.8 + 32
def forecastInFahrenheit: Seq[Double] = temperatures.map(convertCtoF)
}
在這個例子中,方法convertCtoF
被傳入forecastInFahrenheit
。這是可以的,因為編譯器強制將方法convertCtoF
轉成了函數x => convertCtoF(x)
(注: x
是編譯器生成的變量名,保證在其作用域是唯一的)。
使用高階函數的一個原因是減少冗余的代碼。比方說需要寫幾個方法以通過不同方式來提升員工工資,若不使用高階函數,代碼可能像這樣:
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)
}
注意這三個方法的差異僅僅是提升的比例不同,為了簡化代碼,其實可以把重復的代碼提到一個高階函數中:
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
有兩個參數,薪資列表和一個類型為Double => Double
的函數(參數和返回值類型均為Double),返回薪資提升的結果。
有一些情況你希望生成一個函數, 比如:
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
,這意味著返回的匿名函數有兩個String參數,返回一個String。在這個例子中,返回的匿名函數是
(endpoint: String, query: String) => s"https://www.example.com/$endpoint?$query"。
感謝各位的閱讀,以上就是“scala高階函數是什么”的內容了,經過本文的學習后,相信大家對scala高階函數是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。