使用混入组合类
用于组合类的特质称为混入。
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)