Kotlin 数据容器 - List(List 概述、创建 List、List 核心特性、List 元素访问、List 遍历)

一、List 概述

  1. List 是一个不可变的有序集合,一旦创建就不能修改其内容,即不能添加、删除、更改元素

  2. List 提供了丰富的操作函数来处理数据


二、创建 List

1、基础创建
  1. 通过 listOf 函数创建(推荐)
kotlin 复制代码
// 创建一个 List,包含 3 个元素
val fruitList = listOf("Apple", "Banana", "Orange")

println("fruitList: $fruitList")
复制代码
# 输出结果

fruitList: [Apple, Banana, Orange]
  1. 通过 List 构造函数创建
kotlin 复制代码
// 创建一个 List,包含 5 个元素,基于索引计算每个元素的值
val numberList = List(5) { it * 2 }

// 创建一个 List,包含 3 个元素,每个元素都是 "Kotlin"
val repeatList = List(3) { "Kotlin" }

// 创建一个 List,包含 5 个元素,每个元素都是 Unit
val testList = List(5) {}

println("numberList: $numberList")
println("repeated: $repeatList")
println("testList: $testList")
复制代码
# 输出结果

numberList: [0, 2, 4, 6, 8]
repeated: [Kotlin, Kotlin, Kotlin]
2、创建空 List
  1. 通过 emptyList 函数创建
kotlin 复制代码
val emptyList1 = emptyList<String>()

println("emptyList1: $emptyList1")
复制代码
# 输出结果

emptyList1: []
  1. 通过 listOf 函数创建
kotlin 复制代码
val emptyList2 = listOf<String>()

println("emptyList2: $emptyList2")
复制代码
# 输出结果

emptyList2: []
  1. 通过 List 构造函数创建
kotlin 复制代码
val emptyList3 = List(0) { it }

println("emptyList3: $emptyList3")
复制代码
# 输出结果

emptyList3: []

三、List 核心特性

1、类型推断
  1. 明确类型
kotlin 复制代码
val stringList1 = listOf<String>("A", "B")
kotlin 复制代码
// 等同于

val stringList2 = listOf("A", "B")
  1. 类型推断
kotlin 复制代码
val anyList = listOf(1, "test", true) // 类型推断为 List<Any>
2、不可变性
kotlin 复制代码
val fruitList = listOf("Apple", "Banana", "Orange")

fruitList[0] = "Watermelon"
复制代码
# 输出结果(编译错误)

Kotlin: Unresolved reference. None of the following candidates is applicable because of receiver type mismatch: 
public inline operator fun kotlin.text.StringBuilder /* = java.lang.StringBuilder */.set(index: Int, value: Char): Unit defined in kotlin.text

Kotlin: No set method providing array access
kotlin 复制代码
val fruitList = listOf("Apple", "Banana", "Orange")

fruitList.add("Watermelon")
复制代码
# 输出结果(编译错误)

Kotlin: Unresolved reference: add

四、List 元素访问

1、基础访问
  • 通过 [] 操作符与 get 方法访问
kotlin 复制代码
val colors = listOf("红", "绿", "蓝")

val first = colors[0]
val second = colors.get(1)

println("first: $first")
println("second: $second")
  • 它们都会抛出索引越界异常
kotlin 复制代码
val colors = listOf("红", "绿", "蓝")

val result = colors[10]

println("result: $result")
复制代码
# 输出结果

java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 3
kotlin 复制代码
val colors = listOf("红", "绿", "蓝")

val result = colors.get(10)

println("result: $result")
复制代码
# 输出结果

java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 3
2、安全访问
(1)基本介绍
方法 说明
firstOrNull 返回 List 的第一个元素,如果 List 为空则返回 null
lastOrNull 返回 List 的最后一个元素,如果 List 为空则返回 null
getOrNull 返回指定索引的元素,如果索引超出范围则返回 null
getOrElse 返回指定索引的元素,如果索引超出范围则返回默认值
(2)演示
kotlin 复制代码
val colors = listOf("红", "绿", "蓝")

val result1 = colors.firstOrNull()
val result2 = colors.lastOrNull()
val result3 = colors.getOrNull(5)
val result4 = colors.getOrElse(5) { "默认颜色" }

println("result1: $result1")
println("result2: $result2")
println("result3: $result3")
println("result4: $result4")
复制代码
# 输出结果

result1: 红
result2: 蓝
result3: null
result4: 默认颜色
kotlin 复制代码
val colors = emptyList<String>()

val result1 = colors.firstOrNull()
val result2 = colors.lastOrNull()
val result3 = colors.getOrNull(5)
val result4 = colors.getOrElse(5) { "默认颜色" }

println("result1: $result1")
println("result2: $result2")
println("result3: $result3")
println("result4: $result4")
复制代码
# 输出结果

result1: null
result2: null
result3: null
result4: 默认颜色
3、条件检索
kotlin 复制代码
val colors = listOf("red", "green", "blue", "yellow")

// 找到第一个符合条件的
val result1 = colors.first { it.length >= 5 }

// 找到最后一个符合条件的
val result2 = colors.last { it.length == 4 }

println("result1: $result1")
println("result2: $result2")
复制代码
# 输出结果

result1: green
result2: blue

五、List 遍历

1、for 循环(推荐)
  1. 遍历元素
kotlin 复制代码
val list = listOf("Apple", "Banana", "Orange")

for (item in list) {
    println(item)
}
复制代码
# 输出结果

Apple
Banana
Orange
  1. 遍历索引
kotlin 复制代码
val list = listOf("Apple", "Banana", "Orange")

for (i in list.indices) {
    println("Index $i: ${list[i]}")
}
复制代码
# 输出结果

Index 0: Apple
Index 1: Banana
Index 2: Orange
2、使用 forEach 方法(推荐)
kotlin 复制代码
val list = listOf("Apple", "Banana", "Orange")

list.forEach { println(it) }
复制代码
# 输出结果

Apple
Banana
Orange
kotlin 复制代码
val list = listOf("Apple", "Banana", "Orange")

list.forEach { item ->
    println(item)
}
复制代码
# 输出结果

Apple
Banana
Orange
3、使用 forEachIndexed 方法(推荐)
kotlin 复制代码
val colors = listOf("红", "绿", "蓝")

colors.forEachIndexed { index, item ->
    println("Index $index: $item")
}
复制代码
# 输出结果

Index 0: 红
Index 1: 绿
Index 2: 蓝
4、使用迭代器
kotlin 复制代码
val colors = listOf("红", "绿", "蓝")

val iterator = colors.iterator()

while (iterator.hasNext()) {
    println(iterator.next())
}
复制代码
# 输出结果

红
绿
蓝
5、使用 withIndex 方法
kotlin 复制代码
val colors = listOf("红", "绿", "蓝")

for ((index, value) in colors.withIndex()) {
    println("$index: $value")
}
复制代码
# 输出结果

0: 红
1: 绿
2: 蓝
6、使用 List.size + get 方法
kotlin 复制代码
val fruitList = listOf("Apple", "Banana", "Orange")

for (i in 0 until fruitList.size) {
    println(fruitList.get(i))
}
复制代码
# 输出结果

Apple
Banana
Orange
相关推荐
xiaowu0804 分钟前
策略模式-不同的鸭子的案例
开发语言·c#·策略模式
edjxj28 分钟前
Qt图片资源导入
开发语言·qt
qq_259297247330 分钟前
QT-事件
开发语言·qt
专注VB编程开发20年34 分钟前
CSS 的命名方式像是 PowerShell 的动词-名词结构,缺乏面向对象的层级关系
开发语言·后端·rust
古译汉书35 分钟前
嵌入式铁头山羊stm32-ADC实现定时器触发的注入序列的单通道转换-Day26
开发语言·数据结构·stm32·单片机·嵌入式硬件·算法
野犬寒鸦37 分钟前
力扣hot100:相交链表与反转链表详细思路讲解(160,206)
java·数据结构·后端·算法·leetcode
你是人间五月天1 小时前
sentinel实现控制台与nacos数据双向绑定
windows·sentinel
ytadpole1 小时前
揭秘设计模式:工厂模式的五级进化之路
java·设计模式
计算机毕业设计木哥1 小时前
计算机毕设选题:基于Python+Django的B站数据分析系统的设计与实现【源码+文档+调试】
java·开发语言·后端·python·spark·django·课程设计
失散131 小时前
分布式专题——1.2 Redis7核心数据结构
java·数据结构·redis·分布式·架构