二元组和三元组

在编程中,当我们希望执行某些操作时会使用函数,例如计算一个数字的绝对值,或找出成绩最好的学生。然而,函数有一个“小问题”:它们只能返回一种类型的一个值。如果我们想要返回多个不同类型的值怎么办?Kotlin 提供了两个特殊的类来帮助我们处理这种情况:PairTriple。我们来看看它们是如何工作的。


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

我们可以使用 firstsecond 属性,或者 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 的字符串表示形式,包括其 firstsecond 值:

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(三元组)

TriplePair 类似,是一个简单的数据类型,用于表示三个值的组合。这三个值可以是相同或不同的类型。

val triple = Triple(1, "A", true)
println(triple)

解释: 创建了一个包含整数、字符串和布尔值的 Triple,并将其打印出来。


如何使用 Triple

我们可以使用 firstsecondthird 属性,或使用 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 中轻松返回两个或三个值。记住,PairTriple 中的值可以是不同类型的,而且可以通过属性名或组件方法访问它们。使用它们可以让你在不定义额外类的情况下高效地返回多个值,优化你的代码结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值