当前位置: 首页 > web >正文

kotlin一个函数返回多个值

一、主要实现方式

1. Pair/Triple 元组

  • 用途:临时快速返回 2 或 3 个简单值,适用于简单场景
  • 语法
    fun getStatus(): Pair<Int, String> {return Pair(200, "Success") // 等价于 200 to "Success"
    }// 解构接收
    val (code, message) = getStatus()
  • 优点:代码简洁,无需定义新类型
  • 缺点:可读性差(无法通过属性名理解含义),难以扩展

2. 自定义数据类 (Data Class)

  • 用途:结构化返回多个强类型属性,适合复杂场景
  • 语法
    data class ApiResult(val code: Int, val message: String,val timestamp: Long = System.currentTimeMillis()
    )fun getApiResult(): ApiResult {return ApiResult(200, "Success")
    }
  • 优点
    • 语义明确(通过属性名自解释)
    • 支持默认值、扩展性更强
    • 自动生成 equals()/hashCode()/toString() 等方法

3. 密封类 (Sealed Class)

  • 用途:明确限定可能的返回值类型,常用于状态或结果封装
  • 语法
    sealed class DownloadResult {data class Success(val file: File, val size: Long) : DownloadResult()data class Error(val code: Int, val message: String) : DownloadResult()object Loading : DownloadResult()
    }fun downloadFile(): DownloadResult {// 返回具体子类实例
    }
  • 优点
    • 类型安全(when 表达式可穷举所有分支)
    • 结合不同数据类型(如成功返回文件,失败返回错误码)

4. 解构声明 (Destructuring Declaration)

  • 用途:将对象的属性直接解构为多个变量
  • 语法
    // 数据类默认支持解构
    data class Point(val x: Int, val y: Int)val point = Point(10, 20)
    val (x, y) = point // x=10, y=20// 自定义解构逻辑(通过 componentN() 函数)
    class CustomResult(val code: Int, val msg: String) {operator fun component1() = codeoperator fun component2() = msg
    }
  • 适用场景:快速获取多个属性值,无需通过对象访问

二、知识点深度解析

1. 可空性处理

fun findUser(): Pair<String, Int>? {// 可能返回 null
}// 安全调用 + 解构
val (name, age) = findUser() ?: return

2. 类型安全校验

密封类强制处理所有可能类型:

when (val result = downloadFile()) {is DownloadResult.Success -> showFile(result.file)is DownloadResult.Error -> showError(result.code)DownloadResult.Loading -> showProgress()
}

3. 性能对比

  • Pair/Triple:轻量级,适用于高频调用
  • 数据类:内存略高,但可通过 val 不可变性优化

三、最佳实践建议

场景

推荐方式

理由

临时返回两个值

Pair

快速实现,无需额外类型

API 响应封装

数据类

明确字段含义,易扩展

状态机/结果流

密封类

强制处理所有分支,类型安全

高频简单操作

解构声明

简化代码,提升可读性


四、实战案例

网络请求结果封装

sealed class NetworkResult<out T> {data class Success<T>(val data: T) : NetworkResult<T>()data class Error(val code: Int, val message: String) : NetworkResult<Nothing>()object Loading : NetworkResult<Nothing>()
}fun fetchData(): NetworkResult<String> {return try {NetworkResult.Success("Data loaded")} catch (e: Exception) {NetworkResult.Error(500, "Server error")}
}// 使用
when (val result = fetchData()) {is NetworkResult.Success -> println(result.data)is NetworkResult.Error -> println("Error: ${result.code}")NetworkResult.Loading -> showProgress()
}

通过选择合适的多返回值模式,可以显著提升代码的健壮性和可维护性。

http://www.xdnf.cn/news/4370.html

相关文章:

  • 线性代数之矩阵运算:驱动深度学习模型进化的数学引擎
  • 数据可视化与数据编辑器:直观呈现数据价值
  • 在 Ubuntu 中配置 Samba 实现「特定用户可写,其他用户只读」的共享目录
  • SAP如何反查增强点的位置呢?怎么判断这个报错是增强,还是标准信息呢?
  • Postman最佳平替, API测试工具Bruno实用教程(一):基础篇
  • (2025,AR,NAR,GAN,Diffusion,模型对比,数据集,评估指标,性能对比)文本到图像的生成和编辑:综述
  • 2025年渗透测试面试题总结-网络安全、Web安全、渗透测试笔试总结(一)(附回答)(题目+回答)
  • 大模型工具与案例:云服务器部署dify(1)
  • 不同OS版本中的同一yum源yum list差异排查思路
  • Unity垃圾回收(GC)
  • 项目模拟实现消息队列第二天
  • Compose Multiplatform iOS 稳定版发布:可用于生产环境,并支持 hotload
  • C++命名空间、内联与捕获
  • linux环境安装docker
  • AI一键替换商品融入场景,5分钟打造专业级商品图
  • 自编码器(Autoencoder)
  • 遥感数据处理、机器学习建模与空间预测的全流程指南——涵盖R语言(随机森林、XGBoost、SVM等)、特征提取、模型优化及生态学案例分析
  • Ubuntu日志文件清空的三种方式
  • 力扣49. 字母异位词分组(哈希表)
  • suna界面实现原理分析(三):Terminal工具调用可视化
  • 强化学习是AI Agent的进化引擎还是技术枷锁呢?
  • ​Spring + Shiro 整合的核心要点及详细实现说明
  • vLLM 推理 Qwen2.5-VL-7B 视频
  • 2025最新vmware-17虚拟机安装教程(保姆级,图文讲解,带安装包)
  • 餐饮加盟店如何通过日事清全流程闭环管理实现进度同步与效率升级?
  • 强化学习策略梯度推导
  • 漏洞检测服务费用受哪些因素制约?费用区间是多少?
  • 蓝肽子序列--字符串+最长子序列的dp
  • 从零开始学java--集合类(2)
  • 职业短线交易系统