作为值的函数
一等函数
作为值的函数 是 CoddyKit 上的免费 Scala for Backend Engineering & Functional Programming 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Scala for Backend Engineering & Functional Programming 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Scala for Backend Engineering & Functional Programming 课程共包含 4 节课。
函数是值
在 Scala 中,函数是一等值。您可以将它们存储在变量中,将它们作为参数传递,也可以从其他函数中返回它们,就像数字或字符串一样。
object Main {
def main(args: Array[String]): Unit = {
val increment: Int => Int = x => x + 1
println(increment(5))
}
}函数类型语法
类型 Int => String 表示一个接收 Int 并返回 String 的函数。多个参数使用括号表示:(Int, Int) => Int。
object Main {
def main(args: Array[String]): Unit = {
val add: (Int, Int) => Int = (a, b) => a + b
val label: Int => String = n => s"value=$n"
println(add(3, 4))
println(label(7))
}
}Lambda(匿名函数)语法
匿名函数,也称为lambda,写作 (params) => body。它没有名称,通常直接传递给另一个函数。
object Main {
def main(args: Array[String]): Unit = {
val square = (x: Int) => x * x
println(square(6))
}
}高阶函数
高阶函数是指接收函数作为参数,或返回函数的函数。map 和 filter 就是典型示例。
object Main {
def applyTwice(f: Int => Int, x: Int): Int = f(f(x))
def main(args: Array[String]): Unit = {
println(applyTwice(_ + 3, 10))
}
}将函数传递给方法
集合方法可以接收函数。您可以内联传递 lambda,也可以传递一个命名的函数值。
object Main {
def main(args: Array[String]): Unit = {
val triple = (x: Int) => x * 3
println(List(1, 2, 3).map(triple))
println(List(1, 2, 3).map(x => x * 3))
}
}返回函数
函数可以返回另一个函数。这里的 multiplier 返回一个按固定倍数相乘的函数,也就是一个小型函数工厂。
object Main {
def multiplier(factor: Int): Int => Int = x => x * factor
def main(args: Array[String]): Unit = {
val timesTen = multiplier(10)
println(timesTen(5))
}
}方法与函数
def 定义的是一个方法。您可以使用 eta-展开下划线将方法转换为函数值:methodName _;或者只需在需要函数的地方直接使用该方法。
object Main {
def doubleIt(x: Int): Int = x * 2
def main(args: Array[String]): Unit = {
val f: Int => Int = doubleIt
println(f(8))
println(List(1, 2, 3).map(doubleIt))
}
}无参数函数
函数可以不接收任何参数。其类型写作 () => T。这对于延迟计算很有用。
object Main {
def main(args: Array[String]): Unit = {
val greeting: () => String = () => "Hello!"
println(greeting())
}
}将函数存储在集合中
由于函数是值,您可以将它们存储在列表或映射中,并动态查找它们,从而构建一个小型命令分派器。
object Main {
def main(args: Array[String]): Unit = {
val ops: Map[String, (Int, Int) => Int] = Map(
"add" -> (_ + _),
"mul" -> (_ * _)
)
println(ops("add")(3, 4))
println(ops("mul")(3, 4))
}
}将函数作为配置
传递函数可以让调用者自定义行为。这里的通用函数 transformAll 会将任意函数应用于整个列表。
object Main {
def transformAll(xs: List[Int], f: Int => Int): List[Int] = xs.map(f)
def main(args: Array[String]): Unit = {
println(transformAll(List(1, 2, 3), _ + 100))
println(transformAll(List(1, 2, 3), _ * 10))
}
}更简洁的自定义示例
下面以更清晰的方式实现了相同的思路:由调用者提供转换逻辑,使辅助函数保持通用且可复用。
object Main {
def transformAll(xs: List[Int], f: Int => Int): List[Int] = xs.map(f)
def main(args: Array[String]): Unit = {
println(transformAll(List(1, 2, 3), x => x + 100))
println(transformAll(List(1, 2, 3), x => x * x))
}
}快速检查
什么是高阶函数?
回顾
您学习了函数是一等值:
- 将函数存储在
val、列表和映射中 - 函数类型,例如
Int => String - Lambda:
(x) => body和_简写形式 - 高阶函数接收或返回函数
- 通过 eta-展开将方法转换为函数值
常见问题解答
「作为值的函数」课时是免费的吗?
是的 — 「作为值的函数」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Scala for Backend Engineering & Functional Programming 课程的其余内容,请升级到 CoddyKit PRO。 Scala for Backend Engineering & Functional Programming 课程共包含 4 节课。
「作为值的函数」这节课中我会学到什么?
一等函数 你通过在浏览器中直接运行的动手代码来练习 Scala for Backend Engineering & Functional Programming,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Scala for Backend Engineering & Functional Programming 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Scala for Backend Engineering & Functional Programming 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「作为值的函数」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Scala for Backend Engineering & Functional Programming 课中编写并运行代码吗?
能。每节 Scala for Backend Engineering & Functional Programming 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。