函数基础 #

一、函数定义 #

1.1 基本语法 #

scala
def functionName(parameters): ReturnType = body

1.2 简单函数 #

scala
def greet(): Unit =
  println("Hello, Scala!")

def add(a: Int, b: Int): Int =
  a + b

def square(x: Int): Int = x * x

1.3 函数调用 #

scala
greet()

val sum = add(10, 20)
println(sum)

val result = square(5)
println(result)

二、参数 #

2.1 多个参数 #

scala
def printInfo(name: String, age: Int, city: String): Unit =
  println(s"$name, $age years old, lives in $city")

printInfo("Alice", 25, "Beijing")

2.2 无参数函数 #

scala
def currentTime(): Long = System.currentTimeMillis()

def pi = 3.14159

println(currentTime())
println(pi)

2.3 默认参数 #

scala
def greet(name: String, greeting: String = "Hello"): String =
  s"$greeting, $name!"

println(greet("Alice"))
println(greet("Bob", "Hi"))

2.4 命名参数 #

scala
def createPerson(name: String, age: Int, city: String = "Unknown"): Person =
  Person(name, age, city)

createPerson("Alice", 25)
createPerson(name = "Bob", age = 30)
createPerson(age = 35, name = "Charlie")
createPerson("David", city = "Shanghai", age = 28)

三、返回值 #

3.1 显式返回类型 #

scala
def add(a: Int, b: Int): Int = a + b

def greet(name: String): String = s"Hello, $name!"

def isEven(n: Int): Boolean = n % 2 == 0

3.2 类型推断 #

scala
def add(a: Int, b: Int) = a + b

def greet(name: String) = s"Hello, $name!"

3.3 Unit 返回类型 #

scala
def printMessage(msg: String): Unit =
  println(msg)

def log(msg: String): Unit =
  println(s"[${java.time.LocalDateTime.now()}] $msg")

3.4 块表达式返回值 #

scala
def calculate(x: Int): Int =
  val doubled = x * 2
  val squared = doubled * doubled
  squared

def process(input: String): String =
  val trimmed = input.trim
  val upper = trimmed.toUpperCase
  upper

四、多参数列表 #

4.1 柯里化函数 #

scala
def add(a: Int)(b: Int): Int = a + b

val result = add(10)(20)

val addTen = add(10) _
val result2 = addTen(5)

4.2 多参数列表示例 #

scala
def foldLeft[A, B](list: List[A])(initial: B)(f: (B, A) => B): B =
  list.foldLeft(initial)(f)

val sum = foldLeft(List(1, 2, 3, 4, 5))(0)(_ + _)

4.3 配置与数据分离 #

scala
def process(config: Config)(data: Data): Result =
  ???

val processor = process(defaultConfig) _
val result = processor(someData)

五、可变参数 #

5.1 定义可变参数 #

scala
def sum(numbers: Int*): Int =
  numbers.sum

sum(1, 2, 3, 4, 5)
sum()

5.2 可变参数与普通参数 #

scala
def format(prefix: String, values: String*): String =
  s"$prefix: ${values.mkString(", ")}"

format("Names", "Alice", "Bob", "Charlie")

5.3 传递序列给可变参数 #

scala
val numbers = Seq(1, 2, 3, 4, 5)
val result = sum(numbers*)

5.4 可变参数内部实现 #

scala
def printAll(args: String*): Unit =
  args.foreach(println)
  println(s"Total: ${args.length} arguments")

六、递归函数 #

6.1 普通递归 #

scala
def factorial(n: Int): Int =
  if n <= 1 then 1
  else n * factorial(n - 1)

factorial(5)

6.2 尾递归 #

scala
@annotation.tailrec
def factorial(n: Int, acc: Int = 1): Int =
  if n <= 1 then acc
  else factorial(n - 1, n * acc)

factorial(5)

6.3 尾递归优化 #

尾递归函数会被编译器优化为循环,不会栈溢出:

scala
@annotation.tailrec
def countdown(n: Int): Unit =
  if n > 0 then
    println(n)
    countdown(n - 1)

countdown(100000)

6.4 相互递归 #

scala
@annotation.tailrec
def isEven(n: Int): Boolean =
  if n == 0 then true
  else isOdd(n - 1)

@annotation.tailrec
def isOdd(n: Int): Boolean =
  if n == 0 then false
  else isEven(n - 1)

七、嵌套函数 #

7.1 定义嵌套函数 #

scala
def outer(x: Int): Int =
  def inner(y: Int): Int = x + y
  inner(10)

outer(5)

7.2 嵌套函数访问外部变量 #

scala
def process(data: List[Int]): List[Int] =
  val threshold = 10
  
  def filterData(item: Int): Boolean = item > threshold
  
  def transform(item: Int): Int = item * 2
  
  data.filter(filterData).map(transform)

7.3 嵌套函数隐藏实现 #

scala
def factorial(n: Int): Int =
  @annotation.tailrec
  def loop(current: Int, acc: Int): Int =
    if current <= 1 then acc
    else loop(current - 1, current * acc)
  
  loop(n, 1)

八、函数作为值 #

8.1 函数类型 #

scala
val add: (Int, Int) => Int = (a, b) => a + b
val greet: String => String = name => s"Hello, $name!"

add(10, 20)
greet("Scala")

8.2 函数赋值 #

scala
def double(x: Int): Int = x * 2

val doubler: Int => Int = double
val result = doubler(5)

8.3 函数作为参数 #

scala
def applyTwice(f: Int => Int, x: Int): Int = f(f(x))

def double(x: Int): Int = x * 2

applyTwice(double, 3)

九、方法与函数 #

9.1 方法(Method) #

使用 def 定义的是方法:

scala
def add(a: Int, b: Int): Int = a + b

9.2 函数(Function) #

函数是对象,可以赋值给变量:

scala
val add = (a: Int, b: Int) => a + b

9.3 方法转函数 #

使用 _ 将方法转换为函数:

scala
def add(a: Int, b: Int): Int = a + b

val addFunc = add _
val addFunc2: (Int, Int) => Int = add

9.4 Eta 扩展 #

Scala 会自动进行 Eta 扩展:

scala
def double(x: Int): Int = x * 2

val numbers = List(1, 2, 3, 4, 5)
numbers.map(double)
numbers.map(double _)

十、函数最佳实践 #

10.1 使用有意义的函数名 #

scala
def calculateTotalPrice(items: List[Item]): Double = ???
def isEligibleForDiscount(customer: Customer): Boolean = ???
def sendEmail(to: String, subject: String, body: String): Unit = ???

10.2 保持函数简短 #

scala
def processOrder(order: Order): Result =
  val validated = validate(order)
  val priced = calculatePrice(validated)
  val saved = save(priced)
  sendConfirmation(saved)

def validate(order: Order): Order = ???
def calculatePrice(order: Order): Order = ???
def save(order: Order): Order = ???
def sendConfirmation(order: Order): Result = ???

10.3 使用默认参数减少重载 #

scala
def connect(host: String, port: Int = 8080, timeout: Int = 5000): Connection = ???

connect("localhost")
connect("localhost", 9090)
connect("localhost", 9090, 10000)

10.4 使用命名参数提高可读性 #

scala
createUser(
  name = "Alice",
  age = 25,
  email = "alice@example.com",
  isActive = true
)

十一、总结 #

函数定义要素 #

要素 说明 示例
def 定义关键字 def add…
参数列表 输入参数 (a: Int, b: Int)
返回类型 输出类型 : Int
函数体 实现逻辑 = a + b

参数特性 #

特性 语法 示例
默认参数 param: Type = value greeting: String = “Hello”
命名参数 name = value greet(name = “Alice”)
可变参数 param: Type* numbers: Int*
多参数列表 (params1)(params2) def add(a: Int)(b: Int)

下一步,让我们学习 高阶函数

最后更新:2026-03-27