用于组合类的特质称为混入。
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 Cnote:类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)由于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方法自动生成一个对应函数。
使用高阶函数的一个理由便是减少冗余代码。
使用高阶函数生成函数用于一些特定的情境,例如生成URL。
val domainName = "www.example.com" def getURL = urlBuilder(ssl=true, domainName) val endpoint = "users" val query = "id=1" val url = getURL(endpoint, query)