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)
✅ 小技巧:变量名不必叫
first
和second
,可根据上下文命名,如(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