Android---Kotlin 学习007

集合可以方便你处理一组数据,也可以作为值参传给函数,和我们学过的其它变量类型一样,List、Set 和 Map 类型的变量也分为两类,只读和可变

List创建与元素获取

通过 listOf() 函数创建一个 List 集合。

    val listString : List<String> = listOf("HL", "HYM", "HMY")val listInt = listOf(1, 2, 3, 5)

在 kt 中获取 List 中的元素和 java 一样,listInt[index] 就可以获取 index 位置的元素。

通过索引获取 List 中的元素,那么就会存在 ArrayIndexOutOfBoundsException 异常。如下所示

fun main() {val listInt = listOf(1, 2, 3, 5)System.out.println(listInt[4]) // 显然 List 里没有索引为 4 的元素
}

对于这种情况,在 kotlin 里面提供了很多安全函数,来避免异常索引。

\bullet getOrElse:getOrElse 是一个安全索引取值函数,它需要两个参数,第一个是索引值,第二个是能提供默认值的 lambda 表达式,如果索引值不存在的话,可以用来 lambda 的默认值来替异常。

示例:

\bullet getOrNull:getOrNull 是 Kotlin 提供的另一个安全索引取值函数,它返回 null 结果,而不是抛出异常。

示例:

通过这两种方法,当我们不小心索引越界时,就不会抛出异常。

可变列表

在 Kotlin 中,支持内容修改的列表叫可变列表。要创建可变列表,可以使用 mutableListOf 函数。List。List 还支持使用 toList 和 toMutableList 函数,动态实现只读列表和可变列表的相互转换。

示例:创建可变 List,添加和删除元素。

fun main() {// MutableListval mutableIntList = mutableListOf(1, 2, 3, 4)mutableIntList.add(5)mutableIntList.remove(3) // 根据元素值移除mutableIntList.removeAt(0) // 根据索引移除}

示例:MutableList 和 List 互转

    listOf(1, 2, 3).toMutableList()mutableListOf(1, 2, 3).toList()

mutator 函数 

\bullet 能修改可变列表的函数有一个统一的名字:mutator 函数。比如上面的add()、remove() 函数以及后面的 removeIf() 函数等。

\bullet 添加元素运算符与删除元素运算符

    val mutableStringList = mutableListOf("jack", "bob", "jason")mutableStringList += "Jimmy" // 与 add() 相同mutableStringList -= "jack" // 与 remove() 相同println(mutableStringList)

\bullet 基于 lambda 表达式指定的条件删除元素。removeIf() 函数。

    val mutableStringList = mutableListOf("jack", "bob", "jason")mutableStringList += "Jimmy" // 与 add() 相同mutableStringList -= "jack" // 与 remove() 相同mutableStringList.removeIf { it.contains("jason") } // 如果包含 jason,则将其移除println(mutableStringList)

List 集合遍历

\bullet for in 遍历

示例:

    val list = listOf(3, 2, 5, 1)for (i in list) {print("$i, ")}

\bullet forEach 遍历

    list.forEach { print(it)}

\bullet forEachIndexed 遍历时要获取索引值

list.forEachIndexed{index, element ->println("$index, $element")}

解构语法过滤元素

通过"_"符号过滤不想要的元素

    // 这种写法,可以把 list 里的每个元素赋值给等号前面()里的变量val (one, two ,three) = listOf(3, 2, 1)// 有时我们不需要给()里的每个元素都赋值,而是给几个赋值。TODO 那么不需要赋值的变量就要 _ 代替val (a, _ ,c) = listOf(3, 2, 1)

解释说明:第二行代码中,我们不想给第二个变量赋值,则用 _ 来代替。

Set 创建与元素获取

通过 setOf 创建 set 集合,使用 elementAt 函数读取集合中的元素。

示例:set 取元素时也有 安全索引取值函数

fun main() {val intSet = setOf(1, 2, 3)intSet.forEach {print("$it, ")}// 取元素intSet.elementAt(1)// 取元素时也有 TODO 安全索引取值函数intSet.elementAtOrElse(4){"Unknown"}intSet.elementAtOrNull(3) ?: "Unknown" // 这里还可以和 空合并操作符 一起使用
}

可变 Set 集合

通过 mutableSetOf 创建可变的 set 集合。可变的操作与 List 是一样的。

示例:

    val mutableSet = mutableSetOf(1, 2, 3)mutableSet.add(4)mutableSet -= 3

集合转换与快捷函数

\bullet Set 和 List 是可以相互转换的。通过把 List 转换成 Set,去掉重复元素。

fun main() {val listName = listOf("jack", "bob", "lily", "jack").toSet() // 先转为 set 去重.toList() // 再由 set 转回 listprintln(listName)
}

\bullet 快捷函数。

上面方法的先 toSet() 然后再 toList 有点太麻烦了,kotlin 给我们提供了一个快捷函数 distinct(),直接一步搞定。

    val distinct : List<String> = listOf("jack", "bob", "lily", "jack").distinct()println(distinct)

注意:set 和 list 的区别是,list 中的元素可以重复,而 Set 中的元素是不重复的。即使往 set 集合中方重复的元素,set 会通过覆盖的方式来避免重复。

数组类型

Kotlin 提供各自 Array,虽然是引用类型,但可以编译成 Java 基本数据类型。

示例:

    // 创建 Int 类型数组val intArray : IntArray = intArrayOf(10, 13, 131)// list 也可以直接转为数组listOf(1, 2, 3).toIntArray()// 创建对象数组val array : Array<File> = arrayOf(File("D://xx.txt"), File("D://yy.txt"))

Map 集合

Map 的创建和 List、Set 不同,因为 Map 是键值对的形式,有 key 和 value。和 java 创建 map 也不一样,kotlin 中会用到 to。to 看上去像关键字,但事实上,它是个省略了点号和参数的特殊函数,to 函数将它左边和右边的值转化成一对 Pair。所以也可以直接调用 Pair() 函数。

示例:mapOf() 函数

    // Map 创建mapOf("Jack" to 12, "Bob" to 12, "lily" to 13)mapOf(Pair("Jack", 12), Pair("Bob", 12), Pair("Lily", 13))

读取 Map 的值

\bullet [] 取值运算符,读取键对应的值,如果键不存在就返回 null;

    val map = mapOf("Jack" to 12, "Bob" to 12, "lily" to 13)println(map["jack"])

\bullet getValue,读取键对应的值,如果键不存在就抛出异常;

    val map = mapOf("Jack" to 12, "Bob" to 12, "lily" to 13)println(map.getValue("Bob"))

\bullet getOrElse,读取键对应的值,或者使用匿名函数返回默认值;

    val map = mapOf("Jack" to 12, "Bob" to 12, "lily" to 13)println(map.getOrElse("Rose"){"Unknown"})

如果没有"Rose" 就返回 {}(匿名函数)里的内容

\bullet getOrDefault,读取键对应的值,或者返回默认值。

    val map = mapOf("Jack" to 12, "Bob" to 12, "lily" to 13)println(map.getOrDefault("lilys", 0))

遍历 Map

forEach 遍历 Map。

可变 Map 集合

\bullet 通过 mutableMapOf 创建可变 Map;

    val mutableMap = mutableMapOf("Jack" to 12, "Bob" to 12, "lily" to 13)mutableMap += "HL" to 17mutableMap.put("HYM", 18)

\bullet getOrPut 键值不存在,就添加并返回结果,否则就返回已有键对应的值。

// 如果没有 key 为 XY,那么就放入该键值对,如果有,则获取该键值对
mutableMap.getOrPut("XY"){19}

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

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

相关文章

快来看!苹果开放侧载,对开发者来说是祸是福?

不知道你们听说了没有&#xff1f; 苹果公司在向SEC提供的2023年10-K文件中明确表现&#xff0c;伴随着欧盟委员会《数字市场法案》的正式落地将不得不在苹果手机上开放“应用侧载”功能。 简单来说&#xff0c;就是你的App可以不用在App Store里下载&#xff0c;而是可以通过…

正则表达式:简化模式匹配的利器

正则表达式&#xff1a;简化模式匹配的利器 一、正则表达式简介1.1 正则表达式介绍1.2 正则表达式使用场景 二、正则表达式语法2.1 正则表达式元字符和特性2.2 正则表达式常用匹配 三、正则表达式实战3.1 常见的正则表达式用法3.2 正则表达式的过滤用法3.3 正则表达式的代码用法…

做外贸你遇到过哪些奇葩客户?

近日的某个晚上&#xff0c;突然有一个外国人加whatsapp, 然后对方说是从社媒上看到我的联系方式&#xff0c;所以就加上我了。 我心想&#xff0c;难道对方有什么产品需求&#xff0c;不知道看上的是哪款产品&#xff0c;还没等我回复信息&#xff0c;对方又说他们所在的地区…

基于VGG-16+Android+Python的智能车辆驾驶行为分析—深度学习算法应用(含全部工程源码)+数据集+模型(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Pycharm 环境Android环境 相关其它博客工程源代码下载其它资料下载 前言 本项目采用VGG-16网络模型&#xff0c;使用Kaggle开源数据集&#xff0c;旨在提取图片中的用户特征&#xff0c;最终在移…

智慧工地源码:为施工企业提供专业落地的解决方案

智慧工地利用物联网、大数据、AI等核心技术&#xff0c;实时采集现场数据&#xff0c;自动分析&#xff0c;精准分析、智能决策、科学评价&#xff0c;形成一套数据驱动的新型管理模式。为施工企业提供生产提效、安全可控、成本节约的项目管理解决方案&#xff0c;提升项目部管…

DataGrip连接Hive以及MySQL

如果连接失败&#xff0c;是因为useSSL ,改成NO或者False;

HarmonyOS保存应用数据

数据管理 1 概述 在移动互联网蓬勃发展的今天&#xff0c;移动应用给我们生活带来了极大的便利&#xff0c;这些便利的本质在于数据的互联互通。因此在应用的开发中数据存储占据了非常重要的位置&#xff0c;HarmonyOS应用开发也不例外。 本文将为您介绍HarmonyOS提供的数据管…

若依源码分析

一.登录 1.1 生成验证码 基本思路 后端生成一个表达式,74?11 74?转成图片,传到前端进行展示 将结果11存入redis 前端代码实现: 请求后端地址:http://localhost/dev-api/captchaImage,通过反向代理解决前后端跨域问题,将请求路径变为:http://localhost:8080/captchaImag…

【注解和反射】--03 类的加载、ClassLoader

反射 【Class】哪些类型可以有Class对象&#xff1f; class&#xff1a;外部类&#xff0c;成员(成员内部类&#xff0c;静态内部类)&#xff0c;局部内部类&#xff0c;匿名内部类interface&#xff1a;接口[]&#xff1a;数组enum&#xff1a;枚举annotation&#xff1a;注…

Windows系统下载安装并连接Redis

首先 我们访问地址 https://github.com/tporadowski/redis/releases 这里 我们根据自己的系统选择下载 我是 Windows msi安装包 下载下来之后 我们双击它运行 然后下一步 然后这里要同意它的条款 反正不同意不给用嘛 就这么简单 勾选之后 选择下一步 这里 我们要选一下他的安装…

探讨前端技术的未来:创新与适应的必要性

一、引言 2023年&#xff0c;IT圈似乎被一种悲观的论调所笼罩&#xff0c;那就是“Java 已死、前端已凉”。然而&#xff0c;真相是否如此呢&#xff1f;本文将围绕这一主题&#xff0c;探讨前端的现状和未来发展趋势。 二、为什么会出现“前端已死”的言论 这一言论的出现并…

紫禁城的雪花飞舞

在寂静的冬日&#xff0c;紫禁城迎来了它最美丽的时刻。一场突如其来的大雪&#xff0c;将故宫的每一砖每一瓦都覆盖在白色的雪被之下&#xff0c;仿佛将历史的痕迹都掩藏在一片纯净之中。 雪花纷纷扬扬&#xff0c;宛如历史的画卷在眼前徐徐展开。每一片雪花都像是从古人的诗…