在 Kotlin 中,List 是不可变集合(元素数量和内容不可修改),MutableList 是可变集合(支持增删改操作)。以下是 Kotlin 列表的详细用法和常用操作:
一、创建列表
1. 不可变列表(默认)
val list = listOf("A", "B", "C") // 不可变
val emptyList = emptyList<String>() // 空列表
val typedList = listOf<String>() // 明确类型
2. 可变列表
val mutableList = mutableListOf("A", "B") // 可变
val arrayList = arrayListOf(1, 2, 3) // 底层是 Java ArrayList
3. 构建动态列表(buildList)
val dynamicList = buildList {
add("Kotlin")
addAll(listOf("Java", "Python"))
}
二、访问元素
1. 通过索引
val first = list // 等价于 list.get(0)
val last = list.last() // 最后一个元素
2. 安全访问(避免越界)
val safeItem = list.getOrNull(5) // 越界返回 null
val defaultItem = list.getOrElse(5) { "默认值" } // 越界返回 Lambda 结果
3. 查找元素位置
val index = list.indexOf("B") // 返回第一个匹配项的索引
val lastIndex = list.lastIndexOf("B") // 最后一个匹配项的索引
三、遍历列表
1. 常规遍历
for (item in list) {
println(item)
}
2. 带索引遍历
list.forEachIndexed { index, item ->
println("索引 $index 的元素是 $item")
}
3. 反向遍历
for (item in list.reversed()) {
println(item)
}
四、修改列表(仅 MutableList 可用)
1. 添加元素
mutableList.add("D") // 末尾添加
mutableList.add(1, "插入到索引1") // 指定位置插入
mutableList += "E" // 运算符重载(等价于 add)
2. 删除元素
mutableList.remove("B") // 删除指定元素
mutableList.removeAt(0) // 删除索引位置的元素
mutableList -= "A" // 运算符重载(等价于 remove)
mutableList.clear() // 清空列表
3. 修改元素
mutableList = "新值" // 等价于 set(0, "新值")
五、常用高阶函数操作
1. 转换元素(map)
kotlinCopy Code
val upperList = list.map { it.uppercase() } // ["A", "B", "C"] → ["A", "B", "C"]
2. 过滤元素(filter)
kotlinCopy Code
val filtered = list.filter { it.length > 1 } // 保留长度 >1 的元素
3. 排序(sorted / sortedBy)
kotlinCopy Code
val sortedAsc = list.sorted() // 自然顺序排序
val sortedByLength = list.sortedBy { it.length } // 按字符串长度排序
4. 聚合操作(reduce / fold)
kotlinCopy Code
val sum = listOf(1, 2, 3).reduce { acc, num -> acc + num } // 6
val total = listOf(1, 2, 3).fold(10) { acc, num -> acc + num } // 初始值 10,结果 16
5. 分组(groupBy)
kotlinCopy Code
val grouped = list.groupBy { it.length } // 按长度分组,返回 Map<Int, List<String>>
六、其他实用操作
1. 切片(slice)
kotlinCopy Code
val subList = list.slice(0..1) // 取索引 0 和 1 的元素
2. 去重(distinct)
kotlinCopy Code
val uniqueList = listOf("A", "B", "A").distinct() // ["A", "B"]
3. 检查条件(any / all / none)
kotlinCopy Code
val hasA = list.any { it == "A" } // 是否存在至少一个 "A"
val allValid = list.all { it.length > 0 } // 是否所有元素都满足条件
4. 连接字符串(joinToString)
kotlinCopy Code
val joined = list.joinToString(", ", "[", "]") // 输出 "[A, B, C]"
七、与 Java 互操作
1. 将 Kotlin 列表转 Java 列表
kotlinCopy Code
val javaList: java.util.List<String> = mutableList.toList() // 不可变视图
val javaMutableList: java.util.List<String> = mutableList // 直接传递
2. 处理 Java 返回的列表
kotlinCopy Code
// Java 方法返回的 List 可能为 null 或可修改
val kotlinList: List<String> = javaList.orEmpty().toList() // 转为不可变 Kotlin 列表
八、性能注意事项
- 不可变列表(
listOf)适合数据固定的场景,底层实现通常是优化的数据结构。 - 可变列表(
mutableListOf)基于ArrayList,随机访问快(O(1)),插入/删除末尾元素快(O(1)),中间操作慢(O(n))。 - 链式操作(如多次
map/filter)会生成中间集合,大数据量时考虑用序列(Sequence)优化。
九、示例代码:综合操作
kotlinCopy Code
// 创建可变列表并操作
val numbers = mutableListOf(3, 1, 4, 1, 5, 9)
numbers.add(2)
numbers.remove(1)
// 转换、过滤、排序
val result = numbers
.map { it * 2 } // [6, 8, 2, 10, 18, 4]
.filter { it > 5 } // [6, 8, 10, 18]
.sortedDescending() // [18, 10, 8, 6]
println(result) // 输出 [18, 10, 8, 6]
总结
Kotlin 的 List 和 MutableList 提供了丰富的操作函数,结合函数式编程特性,可以:
- 简洁高效地处理集合数据。
- 避免低级循环和临时变量。
- 通过链式调用实现复杂逻辑。
建议优先使用不可变集合(除非需要修改),并熟悉 map、filter、groupBy 等核心高阶函数。
Kotlin 的数据类 解析 如data
DeepSeek-R1满血版 回答完成
深度思考完成 用时18秒
**
在 Kotlin 中,数据类(Data Class) 是专门为存储数据而设计的类,通过 data 关键字声明。它会自动生成常用方法(如 toString()、equals()、hashCode()、copy()),并支持析构声明,极大简化了数据模型的编写。以下是详细解析:
一、基本语法与特性
1. 定义数据类
kotlinCopy Code
data class User(
val name: String,
val age: Int,
val email: String = "" // 带默认值的参数
)
2. 自动生成的方法
-
**
toString()**
输出类名和所有属性的值:
User(name=Alice, age=30, email=alice@example.com) -
**
equals()与hashCode()**
基于所有主构造函数属性判断对象相等性:kotlinCopy Code val user1 = User("Alice", 30) val user2 = User("Alice", 30) println(user1 == user2) // true -
**
copy()**
创建对象的浅拷贝,支持修改部分属性:val user3 = user1.copy(age = 31) // 仅修改 age -
**
componentN()**
按属性声明顺序生成component1()、component2()等函数,支持析构:val (name, age, email) = user1 // 直接解构属性
二、使用场景
1. DTO(数据传输对象)
用于网络请求或数据库交互的模型:
data class ApiResponse(
val code: Int,
val message: String,
val data: User?
)
2. 状态管理
表示 UI 或业务逻辑的状态:
data class LoginState(
val isLoading: Boolean,
val error: String?,
val user: User?
)
3. 简化集合操作
结合 map、filter 处理对象集合:
val users = listOf(User("Alice", 30), User("Bob", 25))
val names = users.map { it.name } // ["Alice", "Bob"]
三、注意事项与限制
1. 主构造函数要求
- 必须至少有一个
val或var参数。 - 不能是
abstract、open、sealed或inner类。
2. 继承与实现
数据类可以继承其他类或实现接口:
data class AdminUser(
val role: String,
name: String,
age: Int
) : User(name, age), Serializable
3. 手动重写方法
如需自定义行为,可显式重写生成的方法:
data class CustomUser(val id: String, val name: String) {
override fun toString(): String {
return "#$id: $name"
}
}
4. 深拷贝问题
copy() 是浅拷贝,引用类型属性不会复制:
data class Company(val name: String, val employees: MutableList<User>)
val company1 = Company("Tech", mutableListOf(User("Alice", 30)))
val company2 = company1.copy()
company2.employees.add(User("Bob", 25))
// company1.employees 也会包含 Bob(浅拷贝问题)
四、数据类 vs 普通类
| 特性 | 数据类 | 普通类 |
|---|---|---|
toString() | 自动生成(显示属性值) | 默认输出类名和哈希值 |
equals()/hashCode | 基于所有主构造函数属性 | 基于对象引用 |
copy() | 自动生成 | 需手动实现 |
| 析构支持 | 自动生成 componentN() | 需手动实现 |
| 适用场景 | 纯数据载体 | 含复杂逻辑的类 |
五、与 JSON 解析库结合
数据类常用于反序列化 JSON 数据(需配合库如 Gson、Moshi 或 kotlinx.serialization):
// 使用 kotlinx.serialization
@Serializable
data class Post(
val id: Int,
val title: String,
val content: String
)
// 反序列化 JSON 字符串
val json = """{"id": 1, "title": "Hello", "content": "World"}"""
val post = Json.decodeFromString<Post>(json)
六、总结
数据类的核心优势:
- 代码简洁:自动生成常用方法,减少样板代码。
- 语义明确:明确表示类用于存储数据。
- 功能实用:支持析构、拷贝和集合操作。
适用场景:
- 需要频繁比较、复制或打印数据的类。
- 作为函数参数或返回值传递的轻量级对象。
- 与 JSON 等序列化/反序列化技术结合使用。