中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

scala高階函數是什么

發布時間:2021-12-08 15:05:59 來源:億速云 閱讀:148 作者:iii 欄目:大數據

這篇文章主要講解了“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高階函數是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

陈巴尔虎旗| 华容县| 林芝县| 湖北省| 广东省| 云浮市| 昌邑市| 海口市| 汝城县| 平山县| 永宁县| 宜都市| 保亭| 文登市| 丰台区| 库尔勒市| 商水县| 门头沟区| 弥渡县| 义乌市| 敦煌市| 武川县| 梁河县| 客服| 太和县| 莱芜市| 平阳县| 信宜市| 大新县| 遵义县| 夹江县| 合山市| 浏阳市| 巴南区| 保康县| 宣恩县| 扶余县| 永清县| 手游| 聊城市| 安平县|