1. 概述

Kotlin 作为一门现代化的 JVM 语言,提供了许多提升开发效率的语言特性。其中,Pair 类用于封装两个相关联的值,是一种轻量级的数据结构,在需要从函数返回多个值或临时组合数据时非常实用。

本文将深入介绍 Kotlin 中 Pair 的使用方式、底层机制以及常见应用场景,帮助你在实际项目中合理运用,避免踩坑。

✅ 典型场景:函数返回结果与状态码、Map 的键值对构建、数据解构等
⚠️ 注意:Pair 并不适合替代具有明确语义的自定义数据类(Data Class)

官方文档参考:Pair

2. Pair 类详解

Pair 是 Kotlin 标准库中定义的一个泛型数据类,源码如下:

public data class Pair<out A, out B>(
    public val first: A,
    public val second: B
) : Serializable

它包含两个只读属性:

  • first:第一个值,类型为 A
  • second:第二个值,类型为 B

由于是 data class,自动具备 equals()hashCode()toString()copy() 等方法。

2.1 构造方式

创建 Pair 有两种常用方式:

方式一:直接构造

val pair = Pair(first = 1, second = "value")
assertEquals(1, pair.first)
assertEquals("value", pair.second)
// pair.first = 2 // ❌ 编译错误:val 不可变

方式二:使用 to 中缀函数(推荐)

Kotlin 提供了 infix fun A.to(B) 扩展函数,语法更简洁自然:

val pairInfixFunction = 1 to "value"
assertTrue(pairInfixFunction is Pair)

✅ 提示:to 是标准库中定义的中缀函数,广泛用于 Map 构建和集合操作,代码可读性更高

2.2 常见用法

toString() 输出友好格式

val pairToString = Pair(first = "Hello", second = "World")
assertEquals("(Hello, World)", pairToString.toString())

equals() 支持值比较

val pair = Pair(first = 1, second = "value")
val otherPair = Pair(first = 1, second = "value")
assertTrue(pair == otherPair) // ✅ 值相等即认为对象相等

解构声明(Destructuring Declaration)

可以直接将 Pair 解构成两个变量:

val pair = Pair(first = 1, second = "value")
val (first, second) = pair
assertEquals(1, first)
assertEquals("value", second)

✅ 小技巧:变量名不必叫 firstsecond,可根据上下文命名,如 (code, message)(key, value) 等,提升语义清晰度

支持任意类型组合

Pair 是泛型类,可以封装任何类型的对象:

val pairOfObjects = Pair(
    first = listOf("one", "two"), 
    second = IntRange(start = 1, endInclusive = 10)
)
assertEquals("([one, two], 1..10)", pairOfObjects.toString())

2.3 扩展功能

Kotlin 标准库为 Pair 提供了便捷的扩展函数 —— toList(),可将其转换为只读列表:

val pair = Pair(first = "Hello", second = "World") 
val listFromPair = pair.toList() 
assertTrue(listFromPair is List<String>)
assertEquals(2, listFromPair.size)
assertEquals("World", listFromPair.sortedDescending().first())

✅ 使用场景:当你需要对 Pair 中的两个元素进行集合操作时(如排序、过滤),转成 List 会更方便

3. Pair 在 Map 中的应用

Pair 最常见的用途之一就是构建 Map 结构。Kotlin 提供了 mapOf() 函数,接受多个 Pair 作为参数:

val mapOfPairs = mapOf(1 to "one", 2 to "two", 3 to "three")
assertEquals("{1=one, 2=two, 3=three}", mapOfPairs.toString())

Map 中:

  • Pair.first 对应 键(key)
  • Pair.second 对应 值(value)

可通过键访问对应的值:

assertEquals("one", mapOfPairs[1])
assertEquals("two", mapOfPairs[2])
assertEquals("three", mapOfPairs[3])

⚠️ 注意:如果存在重复的 first(即 key),后面的会覆盖前面的:

val mapOfPairs = mapOf(1 to "one", 2 to "two", 1 to "three")
assertEquals(2, mapOfPairs.size)     // 实际只有两个 entry
assertEquals("three", mapOfPairs[1]) // key=1 的值被覆盖为 "three"

✅ 踩坑提醒:在动态生成 Pair 列表构建 Map 时,务必注意 key 是否可能重复,否则会导致意料之外的数据丢失

4. 总结

Pair 是 Kotlin 中一个简单但实用的工具类,适用于以下场景:

  • ✅ 函数需要返回两个关联值(如结果 + 状态)
  • ✅ 快速构建 Map 键值对
  • ✅ 临时数据组合与解构

但需注意:

  • ❌ 不应滥用 Pair 替代具有明确业务含义的 data class。例如,用 Pair<String, String> 表示用户姓名和邮箱远不如 UserData(name, email) 清晰
  • ❌ 多于两个值的场景应考虑使用 Triple 或自定义数据类

合理使用 Pair 可以让代码更简洁、表达更自然,但在复杂业务逻辑中仍建议优先使用语义明确的领域模型。

所有示例代码均可在 GitHub 获取:Baeldung Kotlin Tutorials - core-kotlin-lang-4


原始标题:Working With Pair in Kotlin