Kotlin 的Triple集合(Triple<A,B,C>)

在 Kotlin 中,三元组是一个代表三个值的组合的通用类。 它是 Kotlin 的标准库的一部分,适用于需要返回或处理三个相关值的情况,而不需要创建自定义数据类。三元组可以容纳可能不同类型的三个值,这些值通过 first,second 和 third 属性进行访问。

关于三元组的关键点:

  • • 泛型:三元组< A,B,C >可以容纳任何类型的值。A、B 和 C 可以是包括自定义类在内的任何数据类型。

  • • 不变性:就像 Pair 一样,三元组中的值是不可变的,这意味着一旦创建了三元组,其元素就无法更改。

  • • 实用性:它对于需要返回三个相关值的函数,进行解构声明,或者传递三个值的组合非常有用。

基本示例:

val result = Triple(userName, fullName, emaiId) // 一个由 String,String 和 String 组成的 Triple
println("Username: ${result.first}, FullName: ${result.second}, EmailID: ${result.third}")

在此示例中,创建了一个包含人的用户名,全名和电子邮件 ID 的三元组,然后打印这些值。

实际场景的示例:

假设一个场景,你需要从一个函数返回多个值,这个函数要从数据库中获取用户详细信息,包括最新的登录时间戳和上次成功登录后的登录尝试次数。这时,三元组就可以方便地封装这三个信息。

data class User(val id: Int, val name: String)
fun getUserDetails(userId: Int): Triple< User, Long, Int> {
    // make db call
    val user = User(userId, "Hemanth Kumar")
    val lastLoginTimestamp = System.currentTimeMillis() // Current time as example
    val loginAttempts = 3
    return Triple(user, lastLoginTimestamp, loginAttempts)
}

fun main() {
    val (user, lastLogin, attempts) = getUserDetails(1)
    println("User: ${user.name}, Last Login: $lastLogin, Login Attempts: $attempts")
}

在这个例子中,getUserDetails 函数返回了一个由 User 对象,Long 类型的最后登录时间戳和代表登录尝试次数的 Int 组成的三元组。 这种方式简化了返回值和处理多个相关信息的方式,无需为此目的专门定制数据类。

示例 2:

假设一个更复杂的场景,三元组可能非常有用。比如要开发一个在线会议平台的系统,每个会议都有一个 id,一个主题和一系列的参与者。 创建一个函数,给定一个会议 id,函数返回会议的主题,参与者总数和平均满意度。

data class Participant(val name: String, val satisfactionScore: Double)

fun getSessionDetails(sessionId: Int): Triple< String, Int, Double> {
    // Assume we fetch the session details and the participant list from a database
    val sessionTitle = "Quarkus for Beginners"
    val participants = listOf(Participant("Alice", 4.5), Participant("Bob", 4.8), Participant("Charlie", 4.2) )
    val totalParticipants = participants.size
    val averageSatisfaction = participants.map { it.satisfactionScore }.average()
    return Triple(sessionTitle, totalParticipants, averageSatisfaction)
}

fun main() {
    val sessionDetails = getSessionDetails(101)  // Example session id
    println("Session: ${sessionDetails.first}")
    println("Total Participants: ${sessionDetails.second}")
    println("Average Satisfaction: ${sessionDetails.third}")
}

在这个示例中, getSessionDetails 函数返回了一个三元组,包括了会议的主题,参与者的总数,以及平均满意度。这个示例知道了在一个清晰有序的方式中,三元组如何被用于从一个函数中返回多个值。特别是在创建一个自定义类会过于复杂的场景中。

示例 3:银行事务管理

如果我们正在为一个银行开发一个需要管理各种类型的事务(如存款、取款和转账)的系统。每一项事务都涉及到多个信息:事务类型,金额和描述。可以使用三元组来封装每个事务的这三个信息。

data class Account(val accountNumber: String, var balance: Double, val transactions: MutableList< Triple< String, Double, String>> )

fun main() {
    val account = Account("123456789", 10000.0, mutableListOf())

    // Function to add a transaction
    fun addTransaction(account: Account, type: String, amount: Double, description: String) {
        account.transactions.add(Triple(type, amount, description))
        when (type) {
            "Deposit" -> account.balance += amount
            "Withdrawal" -> account.balance -= amount
        }
        println("Transaction successful: $type of $$amount. New balance: ${account.balance}")
    }

    // Adding transactions
    addTransaction(account, "Deposit", 500.0, "Salary deposit")
    addTransaction(account, "Withdrawal", 100.0, "ATM withdrawal")

    // Printing all transactions
    println("\nAll Transactions:")
    account.transactions.forEach { (type, amount, description) ->
        println("$type of $$amount: $description")
    }
}
  • • Account类:这代表了一个银行账户,具有账号,余额和一系列的事务。每一项事务被作为一个由 String(事务类型),Double(金额),和 String(描述)组成的三元组存储。

  • • addTransaction 函数:这个函数获取一个账号,一个事务类型,金额和描述。它创建一个代表事务的三元组并将其加到账户的事务列表中。 然后根据事务类型更新账户余额。

  • • main:创建了一个 Account 对象,使用 addTransaction 函数向它添加了事务,然后遍历事务以将其打印出来,展示每个三元组是如何捕获和表示一组详尽的交易详情的。

何时使用 Pair 和 Triple

Pair 和 Triple 是 Kotlin 的标准库的一部分,它们用于表示两个或三个值的组合,它们被封装为一个单一的对象。以下是使用它们的时刻和地点:

Pair 的使用场景:
  • • 简单的键值表示:当你需要临时关联两个相关的值,而不需要创建一个自定义的数据类。

  • • 从函数中返回两个值:当一个函数需要返回两个相关信息的时候非常有用。例如,计算最小/最大值,返回一个结果和它的状态等。

  • • 在数据转换过程中处理对象对:在达到最后结果之前,中间的步骤涉及到处理一对值。

Triple 的使用场景:
  • • 将三个相关值分组:当三个值有逻辑上的关联,你希望将他们一起传递而不需要创建一个特定的数据类。

  • • 复杂的函数返回值:需要从函数中返回三个相关值,例如一个范围具有下限,上限和步长。

  • • 简化数据聚合:在聚合数据涉及到三个相关信息的场景中,使用 Triple 可以简化这个过程。

通过以下指标,可以判断何时使用 Pair 或 Triple:
  • • 短期使用或本地范围:使用 Pair 或 Triple 进行临时或短期数据分组,尤其是在定义完整数据类的本地范围内。

  • • 复杂性有限:它们最适合简单或中等复杂性的场景。如果您的数据结构涉及三个以上相关项或需要其他功能(如方法),请考虑创建自定义数据类。

  • • 可读性和可维护性:如果使用 Pair 或 Triple 使您的代码更难以理解或维护,则表明应使用数据类,即使对于一小组相关数据也是如此。

结论

Pair 和 Triple 是 Kotlin 中的方便工具,分别用于对两个或三个相关值进行分组。它们对于短期数据分组、从函数返回多个值以及简化某些数据处理任务特别有用。然而,它们的实用性是由代码的复杂性和可读性来平衡的。对于更复杂的场景或当分组数据需要额外的上下文或功能时,定义自定义数据类是首选方法。

转自:Kotlin 的Triple集合(Triple<A,B,C>)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值