Scala 混入、高階函式
阿新 • • 發佈:2018-12-18
使用混入組合類
用於組合類的特質稱為混入。
abstract class A {
val message: String
}
class B extends A {
val message = "I'm an instance of class B"
}
trait C extends A {
def loudMessage = message.toUpperCase()
}
class D extends B with C
note:類D具有超類B,與混入C。
類只能有一個超類但是可以有多個混入(分別使用關鍵字extends與關鍵字with)。混入與超類具有相同的超型別。
高階函式
高階函式將其他函式作為引數或返回一個函式作為結果。因為Scala中,函式是第一類值,所以這是可能的。
# 高階函式map()
val salaries = Seq(20000, 70000, 40000)
val doubleSalary = (x: Int)=> x * 2
val newSalaries = salaries.map(doubleSalary)
# 匿名函式傳入高階函式(編譯器會自動推斷引數型別,無需宣告引數型別)
val ss = salaries.map(x =>x*2)
# 使用_代替引數
val sss = salaries.map(_*3)
1 方法轉為函式
由於Scala編譯器可以將方法轉為函式,所以,可以將方法作為引數傳給高階函式。
case class WeeklyWeatherForecast(temperatures: Seq[Double]) {
private def converCtoF(temp: Double) = temp * 1.8 + 32
def forecastInFahrenheit: Seq[Double] = temperatures.map(converCtoF)
}
note:編譯器會根據converCtoF方法自動生成一個對應函式。
2 接收函式的函式
使用高階函式的一個理由便是減少冗餘程式碼。
3 返回函式的函式
使用高階函式生成函式用於一些特定的情境,例如生成URL。
val domainName = "www.example.com"
def getURL = urlBuilder(ssl=true, domainName)
val endpoint = "users"
val query = "id=1"
val url = getURL(endpoint, query)