在编程中,当我们希望执行某些操作时会使用函数,例如计算一个数字的绝对值,或找出成绩最好的学生。然而,函数有一个“小问题”:它们只能返回一种类型的一个值。如果我们想要返回多个不同类型的值怎么办?Kotlin 提供了两个特殊的类来帮助我们处理这种情况:Pair
和 Triple
。我们来看看它们是如何工作的。
Pair(二元组)
Pair
是 Kotlin 中一个简单的数据类型,用于在一个实例中存储两个值,这两个值可以是相同类型或不同类型。它们之间不需要有任何关系。Pair
表现出值语义,也就是说,当两个 Pair
的两个组成部分都相等时,它们就被认为是相等的。
我们可以使用 Pair
构造函数来创建一个新实例,传入所有的数据值和类型。Kotlin 通常可以根据值推断出类型:
val pair = Pair(1, "one")
println(pair) // (1, one)
解释: 这段代码创建了一个包含整数 1
和字符串 "one"
的 Pair
,然后打印它。输出结果为 (1, one)
。
我们还可以使用 to
这个中缀函数来创建一个新的 Pair
对象:
val pair = 1 to "one"
println(pair) // (1, one)
解释: to
是一个中缀函数,它返回一个 Pair
对象。1 to "one"
的效果等同于 Pair(1, "one")
。
如何使用 Pair
我们可以使用 first
和 second
属性,或者 componentN
方法来提取 Pair
中的值。其中 component1
表示第一个值,component2
表示第二个值。
val pairOne = Pair("Hi", "I am a Pair")
val pairTwo = "Hi" to "I am another Pair"
// 使用属性访问
println(pairOne.first) // Hi
println(pairOne.second) // I am a Pair
// 使用方法访问
println(pairTwo.component1()) // Hi
println(pairTwo.component2()) // I am another Pair
解释: 我们可以通过属性或组件方法来访问 Pair
中的两个值。
toString()
toString()
会返回 Pair
的字符串表示形式,包括其 first
和 second
值:
val pair = Pair("marks", listOf(8.0, 9.0, 10.0))
println(pair) // (marks, [8.0, 9.0, 10.0])
println(pair.toString()) // (marks, [8.0, 9.0, 10.0])
解释: println
默认会调用 toString()
,用于打印对象的内容。
toList()
toList()
方法可以将 Pair
转换为一个列表:
val pair = Pair("marks", listOf(8.0, 9.0, 10.0))
println(pair.toList()) // [marks, [8.0, 9.0, 10.0]]
解释: toList()
将 Pair
的两个值包装进一个列表中。
copy()
我们可以使用 copy()
方法复制 Pair
对象,并通过命名参数修改其属性值:
val pair = Pair("marks", listOf(8.0, 9.0, 10.0))
val other = pair.copy()
println(pair) // (marks, [8.0, 9.0, 10.0])
println(other) // (marks, [8.0, 9.0, 10.0])
我们也可以创建修改后的副本:
val other = pair.copy("other")
val grades = pair.copy(second = listOf(9.0, 7.0, 8.5))
val myCopy = pair.copy(first = "other", second = listOf(1.0, 2.0, 3.0))
println(pair) // (marks, [8.0, 9.0, 10.0])
println(other) // (other, [8.0, 9.0, 10.0])
println(grades) // (marks, [9.0, 7.0, 8.5])
println(myCopy) // (other, [1.0, 2.0, 3.0])
解释: Pair
是不可变的,因此要更改其值只能创建副本。
Triple(三元组)
Triple
与 Pair
类似,是一个简单的数据类型,用于表示三个值的组合。这三个值可以是相同或不同的类型。
val triple = Triple(1, "A", true)
println(triple)
解释: 创建了一个包含整数、字符串和布尔值的 Triple
,并将其打印出来。
如何使用 Triple
我们可以使用 first
、second
和 third
属性,或使用 componentN
方法提取值:
val triple = Triple(1, "I am", "Triple")
// 使用属性访问
println(triple.first) // 1
println(triple.second) // I am
println(triple.third) // Triple
// 使用方法访问
println(triple.component1()) // 1
println(triple.component2()) // I am
println(triple.component3()) // Triple
解释: Triple
提供了三个值的访问方式,使用组件方法或属性名都可以。
toString()
val triple = Triple("marks", "Kotlin", listOf(8.0, 9.0, 10.0))
println(triple) // (marks, Kotlin, [8.0, 9.0, 10.0])
解释: toString()
将 Triple
的三个值格式化为字符串。
toList()
val triple = Triple("marks", "Kotlin", listOf(8.0, 9.0, 10.0))
println(triple.toList()) // [marks, Kotlin, [8.0, 9.0, 10.0]]
解释: toList()
方法将 Triple
的三个值转换为一个列表。
copy()
我们也可以使用 copy()
方法复制 Triple
,并选择性地更改属性值:
val triple = Triple("marks", "Kotlin", listOf(8.0, 9.0, 10.0))
val other = triple.copy("other", third = listOf(7.0, 9.0, 8.5))
val course = triple.copy(second = "Kotlin Triple")
println(triple) // (marks, Kotlin, [8.0, 9.0, 10.0])
println(other) // (other, Kotlin, [7.0, 9.0, 8.5])
println(course) // (marks, Kotlin Triple, [8.0, 9.0, 10.0])
解释: 使用 copy()
可以灵活地复制并修改 Triple
中的任意值。
总结
现在你已经学会了如何在 Kotlin 中轻松返回两个或三个值。记住,Pair
和 Triple
中的值可以是不同类型的,而且可以通过属性名或组件方法访问它们。使用它们可以让你在不定义额外类的情况下高效地返回多个值,优化你的代码结构。