Skip to content

Scala 函数

函数是 Scala 中的基本构建块,它们封装了执行特定任务的可重用代码块。Scala 同时支持方法(Method),即与类或对象关联的函数,以及函数值(Function Value,或称函数字面量 Function Literal),它们本身就是对象。

  • 方法 (Method): 在类、Trait 或对象中使用 def 关键字定义。它操作其包含结构的数据(通过 this 或参数)。
  • 函数值 (Function Value): 表示一个计算的对象。它可以赋值给变量,作为参数传递,并从其他函数返回。通常使用函数字面量语法((params) => body)或通过部分应用方法(partially applying methods)创建。

尽管在讨论中经常互换使用,但理解它们之间的区别对于掌握 Scala 的函数式本质至关重要。

定义方法的基本语法是:

def methodName(param1: Type1, param2: Type2): ReturnType = {
// 方法体:一系列表达式
// 最后一个表达式的值即为返回值
}

关键点:

  • def: 用于开始方法定义的关键字。
  • methodName: 方法的名称。
  • (param1: Type1, ...): 参数列表,包含名称和类型。
  • : ReturnType: 方法返回值的类型。如果方法体不是递归的且返回类型清晰,类型推断(Type Inference)通常使其成为可选。
  • =: 将方法签名与方法体分隔开。
  • { ... }: 包含表达式的方法体。最后一个表达式的值会被隐式返回。在典型的 Scala 代码中,很少需要使用 return 关键字。
object MathUtils {
// 显式返回类型
def addInts(a: Int, b: Int): Int = {
val sum = a + b
sum // 最后一个表达式即为返回值
}
// 推断的返回类型,简洁的方法体
def multiplyInts(a: Int, b: Int) = a * b
}
@main def FunctionDemo1(): Unit = {
println(s"Sum: ${MathUtils.addInts(5, 7)}")
println(s"Product: ${MathUtils.multiplyInts(5, 7)}")
}

输出:

Sum: 12
Product: 35

不返回有意义的值(执行副作用,如打印)的方法,其返回类型为 Unit。这类似于 Java/C++ 中的 void。如果存在 = 符号,返回类型 : Unit 通常可以省略。

object Greeter {
// 显式 Unit 返回类型
def printGreeting(name: String): Unit = {
println(s"Hello, $name!")
}
// 推断的 Unit 返回类型(因为使用了 println)
def printFarewell(name: String) = {
println(s"Goodbye, $name!")
}
}
@main def ProcedureDemo(): Unit = {
Greeter.printGreeting("Scala")
Greeter.printFarewell("World")
}

输出:

Hello, Scala!
Goodbye, World!

方法通常在对象实例上使用点(.)符号调用,或者如果在当前作用域内定义(例如在 object 的 main 方法内部),可以直接调用。

// 标准调用
objectInstance.methodName(arg1, arg2)
// 如果 methodName 没有参数,括号是可选的
objectInstance.methodName
// 单参数方法的中缀表示法
objectInstance methodName arg1 // 等同于 objectInstance.methodName(arg1)

Scala 允许内联定义函数而不给它们命名。这些就是函数值。

// 一个接受 Int 并返回 Int 的函数值
val increment: Int => Int = (x: Int) => x + 1
// 类型推断简化了写法:
val double = (x: Int) => x * 2
// 在高阶方法中使用匿名函数:
val numbers = List(1, 2, 3, 4)
val doubledNumbers = numbers.map(x => x * 2) // 简写形式:numbers.map(_ * 2)
@main def AnonFuncDemo(): Unit = {
println(increment(5)) // Output: 6
println(double(5)) // Output: 10
println(doubledNumbers) // Output: List(2, 4, 6, 8)
}

Scala 提供了许多与函数相关的高级特性,使它成为一个强大的函数式语言:

概念描述
高阶函数 (Higher-Order Functions)接受其他函数作为参数或返回函数的函数。
嵌套函数 (Nested Functions)在其他函数内部定义的函数,对于辅助逻辑很有用。
闭包 (Closures)捕获其周围作用域中变量的函数。
柯里化 (Currying)将一个接受多个参数的函数转换为一个链式函数,每个函数只接受一个参数。
部分应用函数 (Partially Applied Functions)固定函数的某些参数以创建一个参数更少的新函数。
可变参数 (Varargs)接受可变数量同类型参数的函数。
默认参数值 (Default Parameter Values)为函数参数定义默认值。
命名参数 (Named Arguments)调用函数时指定参数名称,允许参数以任意顺序传递。

这些概念对于编写简洁、富有表现力且函数式的 Scala 代码至关重要。详细探索这些概念,以充分利用 Scala 的能力。