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

一、List 概述

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

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


二、创建 List

1、基础创建
  1. 通过 listOf 函数创建(推荐)
// 创建一个 List,包含 3 个元素
val fruitList = listOf("Apple", "Banana", "Orange")println("fruitList: $fruitList")
# 输出结果fruitList: [Apple, Banana, Orange]
  1. 通过 List 构造函数创建
// 创建一个 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 函数创建
val emptyList1 = emptyList<String>()println("emptyList1: $emptyList1")
# 输出结果emptyList1: []
  1. 通过 listOf 函数创建
val emptyList2 = listOf<String>()println("emptyList2: $emptyList2")
# 输出结果emptyList2: []
  1. 通过 List 构造函数创建
val emptyList3 = List(0) { it }println("emptyList3: $emptyList3")
# 输出结果emptyList3: []

三、List 核心特性

1、类型推断
  1. 明确类型
val stringList1 = listOf<String>("A", "B")
// 等同于val stringList2 = listOf("A", "B")
  1. 类型推断
val anyList = listOf(1, "test", true) // 类型推断为 List<Any>
2、不可变性
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.textKotlin: No set method providing array access
val fruitList = listOf("Apple", "Banana", "Orange")fruitList.add("Watermelon")
# 输出结果(编译错误)Kotlin: Unresolved reference: add

四、List 元素访问

1、基础访问
  • 通过 [] 操作符与 get 方法访问
val colors = listOf("红", "绿", "蓝")val first = colors[0]
val second = colors.get(1)println("first: $first")
println("second: $second")
  • 它们都会抛出索引越界异常
val colors = listOf("红", "绿", "蓝")val result = colors[10]println("result: $result")
# 输出结果java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 3
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)演示
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: 默认颜色
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、条件检索
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. 遍历元素
val list = listOf("Apple", "Banana", "Orange")for (item in list) {println(item)
}
# 输出结果Apple
Banana
Orange
  1. 遍历索引
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 方法(推荐)
val list = listOf("Apple", "Banana", "Orange")list.forEach { println(it) }
# 输出结果Apple
Banana
Orange
val list = listOf("Apple", "Banana", "Orange")list.forEach { item ->println(item)
}
# 输出结果Apple
Banana
Orange
3、使用 forEachIndexed 方法(推荐)
val colors = listOf("红", "绿", "蓝")colors.forEachIndexed { index, item ->println("Index $index: $item")
}
# 输出结果Index 0: 红
Index 1: 绿
Index 2: 蓝
4、使用迭代器
val colors = listOf("红", "绿", "蓝")val iterator = colors.iterator()while (iterator.hasNext()) {println(iterator.next())
}
# 输出结果红
绿
蓝
5、使用 withIndex 方法
val colors = listOf("红", "绿", "蓝")for ((index, value) in colors.withIndex()) {println("$index: $value")
}
# 输出结果0: 红
1: 绿
2: 蓝
6、使用 List.size + get 方法
val fruitList = listOf("Apple", "Banana", "Orange")for (i in 0 until fruitList.size) {println(fruitList.get(i))
}
# 输出结果Apple
Banana
Orange

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/90720.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/90720.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS NEXT 系列之规范开发三方共享包

规范开发三方共享包〇、前言一、了解评分规则二、规范开发共享包1、规范开源协议名称写法2、将 oh-package.json5 文件补充完整3、补充 example 目录4、基本的 README 和 CHANGELOG三、ohpm 包的源码隔离特性〇、前言 对于开发者来说&#xff0c;对外发布代码制品&#xff0c;…

[电网备考]计算机组成与原理

计算机系统概述 计算机发展历程 从数据表示: 计算机可以分为数字计算机与模拟计算机 1946 第一台电子数字计算机 ENIAC 在宾夕法尼亚大学诞生,标志进入电子计算机时代时间计算机发展阶段1946-1958电子管计算机时代1958-1964晶体管计算机时代1964-1971集成电路计算机时代1971-至…

8.c语言指针

内存管理C语言中&#xff0c;栈内存&#xff08;局部变量&#xff09;自动分配/释放&#xff0c;静态区&#xff08;全局、静态变量&#xff09;编译时分配&#xff1b;堆内存需手动分配/释放&#xff0c;核心函数有3个&#xff1a;malloc函数原型&#xff1a;void* malloc(siz…

使用GPU训练模型

本文代码详解参考&#xff1a; 模型训练基础流程-CSDN博客 目录 为什么要用GPU训练模型 什么是CUDA 利用GPU训练—方式一(.cuda()) 利用GPU训练—方式二 (.to()) Google Colaboratory 为什么要用GPU训练模型 用 GPU 训练模型的核心原因是GPU 的硬件架构和计算特性&#…

Matlab学习笔记:自定义函数

MATLAB 学习笔记&#xff1a;自定义函数自定义函数是MATLAB编程的基础&#xff0c;它允许你将重复代码封装成可重用的模块&#xff0c;提高代码的可读性和效率。本笔记将覆盖所有重点知识点&#xff0c;包括语法细节、输入输出处理、函数文件管理、错误处理等。我会用自然易懂的…

【数学建模 | Matlab】二维绘图 和 三维绘图

- 第 115 篇 - Date: 2025 - 07 - 23 Author: 郑龙浩&#xff08;仟墨&#xff09; 续写上一篇&#xff0c;如下文章&#xff1a; 【数学建模|Matlab】Matlab「基础知识」和「基础操作」 五 二维绘图 1 举例 % 二维平面绘图&#xff08;扩展至 -2π 到 2π&#xff09; x …

MCP (Model Context Protocol) 与 HTTP API:大模型时代的通信新范式

MCP (Model Context Protocol) 与 HTTP API&#xff1a;大模型时代的通信新范式在数字世界的两端&#xff0c;API 扮演着不可或缺的桥梁角色。我们熟知的 HTTP API 是 Web 互联互通的基石&#xff0c;驱动着无数应用程序的交互。然而&#xff0c;随着大型语言模型&#xff08;L…

CentOS 搭建 Docker 私有镜像仓库

CentOS 搭建 Docker 私有镜像仓库 搭建 Docker 私有镜像仓库能为团队提供高效、安全的镜像管理方案。下面将详细介绍每个步骤的操作细节&#xff0c;其中命令部分均用代码块展示。 一、环境准备 要搭建 Docker 私有镜像仓库&#xff0c;首先得确保服务器环境符合要求&#xff0…

Zookeeper的简单了解

Zookeeper的简单了解 Zookeeper是一个为分布式应用程序提供协调服务的中间件。 主要作用有三点&#xff1a;分布式锁、注册中心、配置管理、。 特点有读写速度快&#xff08;内存存储&#xff09;、有监听机制&#xff08;用于发布订阅&#xff09;、保证了顺序一致性&#xff…

Android Fragment 全解析

在 Android 开发中&#xff0c;Fragment 是构建灵活界面的核心组件 —— 它既能像 “迷你 Activity” 一样包含布局和逻辑&#xff0c;又能灵活地嵌入到不同 Activity 中复用。无论是平板的多面板布局&#xff0c;还是手机的单页切换&#xff0c;Fragment 都能让界面适配更高效…

0-1BFS(双端队列,洛谷P4667 [BalticOI 2011] Switch the Lamp On 电路维修 (Day1)题解)

对于权重为0或1的路径搜索中&#xff0c;使用双端队列可以对最短路问题进行时间复杂度的优化&#xff0c;由于优先队列的O(longn)级别的插入时间&#xff0c;对于双端队列O(1)插入可以将时间复杂度减少至O(M); https://www.luogu.com.cn/problem/P4667 #include<bits/stdc…

基于LNMP架构的分布式个人博客搭建

1.运行环境主机主机名系统服务192.168.75.154Server-WebLinuxWeb192.168.75.155Server-NFS-DNSLinuxNFS/DNS2.基础配置配置主机名&#xff0c;静态IP地址开启防火墙并配置部分开启SElinux并配置服务器之间使用同ntp.aliyun.com进行时间同步服务器之间使用用ntp.aliyun.com进行时…

基于开源AI智能名片链动2+1模式S2B2C商城小程序的人格品牌化实现路径研究

摘要&#xff1a;在数字化消费时代&#xff0c;人格品牌化已成为企业突破同质化竞争的核心策略。本文以开源AI智能名片、链动21模式与S2B2C商城小程序的融合为切入点&#xff0c;构建“技术赋能-关系重构-价值共生”的人格品牌化理论框架。通过分析用户触达、信任裂变与价值沉淀…

设计模式十一:享元模式(Flyweight Pattern)

享元模式是一种结构型设计模式&#xff0c;它通过共享对象来最小化内存使用或计算开销。这种模式适用于大量相似对象的情况&#xff0c;通过共享这些对象的公共部分来减少资源消耗。基本概念享元模式的核心思想是将对象的内在状态&#xff08;不变的部分&#xff09;和外在状态…

Webpack/Vite 终极指南:前端开发的“涡轮增压引擎“

开篇:当你的项目变成"俄罗斯套娃" "我的index.js怎么引入了87个文件?!" —— 这是每个前端开发者第一次面对复杂项目依赖时的真实反应。别担心,今天我要带你认识两位"打包侠":老牌劲旅Webpack和新锐黑马Vite 一、构建工具:前端世界的&qu…

Windows 下配置 GPU 用于深度学习(PyTorch)的完整流程

1. 安装 NVIDIA 显卡驱动 前往 NVIDIA官网 下载并安装适合你显卡型号&#xff08;如 5070Ti&#xff09;的最新版驱动。下载 NVIDIA 官方驱动 | NVIDIA安装完成后建议重启电脑。 2. 安装 CUDA Toolkit 前往 CUDA Toolkit 下载页。 选择 Windows、x86_64、你的系统版本&#…

详解力扣高频SQL50题之180. 连续出现的数字【困难】

传送门&#xff1a;180. 连续出现的数字 题目 表&#xff1a;Logs -------------------- | Column Name | Type | -------------------- | id | int | | num | varchar | -------------------- 在 SQL 中&#xff0c;id 是该表的主键。 id 是一个自增列。 找出所有至少连续…

VSCode 报错 Error: listen EACCES: permission denied 0.0.0.0:2288

使用 npm run dev 启动项目时报错&#xff1a;error when starting dev server: Error: listen EACCES: permission denied 0.0.0.0:2288at Server.setupListenHandle [as _listen2] (node:net:1881:21)at listenInCluster (node:net:1946:12)at Server.listen (node:net:2044:…

[2025CVPR-图象超分辨方向]DORNet:面向退化的正则化网络,用于盲深度超分辨率

1. ​问题背景与挑战​ 盲深度超分辨率&#xff08;Blind Depth Super-Resolution, DSR&#xff09;的目标是从低分辨率&#xff08;LR&#xff09;深度图中恢复高分辨率&#xff08;HR&#xff09;深度图&#xff0c;但现有方法在真实场景下面临显著挑战&#xff1a; ​已知…

关系与逻辑运算 —— 寄存器操作的 “入门钥匙”

前言 哈喽大家好&#xff0c;这里是 Hello_Embed 的新一篇学习笔记。在前文中&#xff0c;我们学习了如何用结构体指针操作硬件寄存器&#xff0c;而寄存器的配置往往离不开位运算和条件判断 —— 比如通过逻辑运算精准修改某几位的值&#xff0c;通过关系运算判断硬件状态。这…