1. 简介

在阅读 Kotlin 代码时,你一定经常看到 -> 这个符号。它就是 Kotlin 中的箭头操作符(arrow operator),虽然看起来简单,但在多种语法结构中扮演着关键角色。

✅ 核心作用:分隔两个代码块,具体含义取决于上下文。
⚠️ 注意:它不是数学中的“指向”,也不是函数式编程里的“映射”概念,而是 Kotlin 语言层面的语法符号。

本文将带你深入理解 -> 在不同场景下的使用方式,避免踩坑,提升代码可读性。


2. when 表达式中的箭头

Kotlin 的 when 是一个强大的多分支控制结构,替代了传统 switch-case。
when 中,-> 用于将条件与对应执行的代码块分开

示例说明:

val label: Int? = 1
val returned = when (label) {
     1 -> "First label"
     2 -> "Second label"
     else -> {
         "Label is neither first nor second"
     }
}
assertEquals("First label", returned)

关键点:

  • 每个分支由 条件 + -> + 执行体 构成
  • 执行体可以是单行表达式(如字符串),也可以是代码块 { }
  • else 分支相当于 default,处理未匹配的情况
  • when 是表达式,能返回值,所以可以直接赋值给变量

❌ 常见误区:以为 -> 是“返回”的意思 —— 实际上它只是语法分隔符,真正返回的是右边的表达式结果。


3. Lambda 表达式中的箭头

Lambda 是 Kotlin 函数式编程的核心特性之一。
在 lambda 中,-> 的作用是:分隔参数列表和函数体

示例:

val numbers = listOf(1, 2, 3, 4)
val multiplication = { x: Int, y: Int -> x * y }
val total = numbers.reduce(multiplication)
assertEquals(24, total)

结构解析:

  • { x: Int, y: Int -> x * y } 是一个完整的 lambda
  • 左边:参数列表,带类型声明
  • ->:分隔符
  • 右边:函数体,最后一行作为返回值

✅ 提示:如果 lambda 只有一个参数且类型可推断,Kotlin 允许省略参数声明和 ->,用 it 代替参数名。例如:

numbers.forEach { println(it) } // 等价于 { x -> println(x) }

⚠️ 踩坑提醒:多个参数时必须显式写出 ->,否则编译失败。


4. 函数类型声明中的箭头

Kotlin 支持高阶函数,即函数可以作为参数或返回值传递。
这时,-> 被用来定义函数类型(Function Type),格式为:

(参数类型) -> 返回类型

场景一:函数变量声明

val multiplication: (Int, Int) -> Int = { a, b -> a * b }
  • (Int, Int) -> Int 表示“接受两个 Int 参数,返回一个 Int”的函数类型
  • 右侧是一个符合该类型的 lambda 实现

场景二:函数作为参数

fun applyOperation(x: Int, y: Int, operation: (Int, Int) -> Int): Int {
    return operation(x, y)
}
  • operation 参数的类型是 (Int, Int) -> Int
  • 调用时传入前面定义的 multiplication 即可:
val appliedOperation = applyOperation(2, 5, multiplication)
assertEquals(10, appliedOperation)

场景三:函数作为返回值

private fun createMultiplier(factor: Int): (Int) -> Int {
    return { input -> input * factor }
}
  • 返回类型是 (Int) -> Int,表示返回一个函数
  • 内部 lambda 捕获了 factor,形成闭包

调用方式:

val triple = createMultiplier(3)
assertEquals(15, triple(5)) // 相当于 5 * 3

✅ 小技巧:这种写法常用于构建策略模式、回调处理器等灵活设计。


5. 总结

使用场景 箭头作用 示例
when 表达式 分隔条件与执行块 1 -> "First"
✅ Lambda 表达式 分隔参数与函数体 { x, y -> x * y }
✅ 函数类型 定义函数签名 (参数) -> 返回值 (Int, Int) -> Int

📌 核心思想:-> 是 Kotlin 中用于逻辑分离的关键语法符号,在不同上下文中统一表达“左边决定右边如何执行”的语义。

所有示例代码均可在 GitHub 获取:https://github.com/Baeldung/kotlin-tutorials/tree/master/core-kotlin-modules/core-kotlin-operators


原始标题:Kotlin Arrow Operator