【Kotlin精简】第2章 集合

1 简介

在 Kotlin 中集合主要分为可变集合只读集合,其中可变集合使用 “Mutable” 前缀 + 集合类名表示,比如 MutableListMutableSetMutableMap 等。而对于只读集合就是和 Java 中集合类名是一致。 Java 中的 List 非 Kotlin 中的 List , 因为 Kotlin 中的 List 是只读的而非可变,却有点类似于 Kotlin 中的 MutableList
在这里插入图片描述

  1. 只读集合:
    内部只具有访问元素的方法,不具有类似 add、remove、clear 之类修改集合的方法。比如 Collection 只读集合内部就没有 add、remove、clear 之类方法,只有 get 访问元素的方法.
  2. 可变集合
    在集合内部既具有访问元素的方法,也具有类似 add、remove、clear 之类修改集合的方法。比如 MutableCollection 可变集合内部就有 addremoveclear 之类方法。

集合是可变数量的一组条目。
List : 是有序集合,可以通过下标访问元素,元素可以重复。
Set : 是无序集合,有别于List集合的地方在于,1.没有下标,2.元素不允许重复。只能遍历获取参数,遍历参数的顺序与添加顺序相同。元素如果已经存在不进行添加。可以存储Null, 而且Null也是唯一的。
Map:是无序集合,通过键值对存储数据。每个键唯一。值可以重复。

集合主要就是ListSetMap,它们在Java中都有接口可以实现,
List --> ArrayList、LinkedList
Set --> HashSet
Map–> HashMap

1.1 List集合

	val list = ArrayList<String>()list.add("1")list.add("2")// 创建的是一个不可变的集合,该集合创建成功只能用于读取数据,不能增删改集合数据。val list1 = listOf("aa", "bb")// 创建的是一个可变的集合,可以进行增删改查操作。val list2 = mutableListOf("cc", "dd")// 遍历List集合需要使用for-in循环进行遍历for (content in list1){// 把遍历内容大写content.toUpperCase()print(content)	// 输出:aa bb}list2.add("ee")list2.addAll(list1)// 移除指定的元素对象。如果指定元素不存在,移除null。不会报错list2.remove("ee")// 移除参数集合中存在的所有元素。 // 或者,你可以关键字作为参数来调用它;在这种情况下,函数移除关键字匹配true 的所有元素。list2.removeAll(list1)// retainAll() 与 removeAll() 相反,// 它移除除参数集合中的元素之外的所有元素。// 当与关键字一起使用时,它只留下与关键字匹配的元素。list2.retainAll(list)

1.2 Set集合

Set和List的用法其实一样,在初始化时会用到这几个方法:setof()mutableSetOf()

	// 不可变的集合val set1 = setOf("aa", "bb") // 可变的集合val set2 = mutableSetOf("cc", "dd") // 新增元素set2.add("ee")set2.addAll(set1)// 移除指定的元素对象。如果指定元素不存在,移除null。不会报错set2.remove("ee")// 移除参数集合中存在的所有元素。 // 或者,你可以关键字作为参数来调用它;在这种情况下,函数移除关键字匹配true 的所有元素。set2.removeAll(set1)// retainAll() 与 removeAll() 相反,// 它移除除参数集合中的元素之外的所有元素。// 当与关键字一起使用时,它只留下与关键字匹配的元素。set2.retainAll(set1)

setof():创建的是一个不可变的集合,该集合创建成功只能用于读取数据,不能增删改集合数据。
mutableSetOf():创建的是一个可变的集合,可以进行增删改查操作。
在这里,Set集合List集合的区别需要注意的是,Set底层是使用Hash映射机制来存储数据的,因此集合中的元素无法保证有序。
----遍历和List一样,就不做解释了

1.3 Map集合

Map集合这里重点介绍,Map和前两者不同,Map是一种键值对形式的数据结构,因此在用法上和List、Set存在很大不同。
一般初始化Map时都需要创建一个HashMap

val map = HashMap<String, String>()
map.put("aa", "1")
map.put("bb", "2")// 因为在Kotlin中,并不建议使用put()、get()方法对Map进行添加和读取数据,
// 而是使用这种类似下标的方式添加数据:
val map1 = HashMap<String, Int>()
map1["aa"] = 1
map1["bb"] = 2// 当读取数据时
val text = map1["aa"]// 移除对应的值,参数为key
map1.remove("aa")

然而,上面这种添加数据方式依然很繁琐,和List、Set一样,Map也有自己的方法mapof()、mutableMapOf()

// 不可变
val map1 = mapOf("aa" to 1, "bb" to 2)  
// 可变
val map2 = mutableMapOf("aa" to 1, "bb" to 2)  

mapof():创建的是一个不可变的集合,该集合创建成功只能用于读取数据,不能增删改集合数据。
mutableMapOf():创建的是一个可变的集合,可以进行增删改查操作。
遍历Map集合,也是使用的for-in循环,唯一区别在于,for-in循环中,map键值对变量一起申明到了一对括号中

fun main(){val map1 = mapOf("aa" to 1, "bb" to 2) for ((content1, content2) in map1){print(content1 + "--" + content2)}
}

1.4 集合迭代器 Iterator

提供一种遍历集合元素的方法,而不暴露集合内部的实现。

1.4.1 迭代器的方式

只要实现了Iterable接口的类型,都提供迭代器。
下面是使用迭代器的3种方式:

  1. 使用next()
val numbers = listOf("one", "two", "three", "four")
val numbersIterator = numbers.iterator()
while (numbersIterator.hasNext()) {println(numbersIterator.next())
}
  1. 使用for…in
val numbers = listOf("one", "two", "three", "four")
for (item in numbers) {println(item)
}
  1. 使用forEach()
val numbers = listOf("one", "two", "three", "four")
numbers.forEach {println(it)
}

1.4.2 List 的迭代器

List 的迭代器是ListIterator类型,可以反向迭代:

val numbers = listOf("one", "two", "three", "four")
val listIterator = numbers.listIterator()
while (listIterator.hasNext()) listIterator.next()
println("Iterating backwards:")
while (listIterator.hasPrevious()) {print("Index: ${listIterator.previousIndex()}")println(", value: ${listIterator.previous()}")
}// Iterating backwards:
// Index: 3, value: four
// Index: 2, value: three
// Index: 1, value: two
// Index: 0, value: one

1.4.3 可变迭代器

可变集合(MutableList, MutableSet, MutableMap)的迭代器都是MutableIterator类型,可以在迭代的过程中调用remove()方法删除元素。

val numbers = mutableListOf("one", "two", "three", "four") 
val mutableIterator = numbers.iterator()mutableIterator.next()
mutableIterator.remove()println("After removal: $numbers")
// After removal: [two, three, four]

另外,MutableList的迭代器是MutableListIterator类型,可以在迭代过程中插入替换元素。

val numbers = mutableListOf("one", "four", "four") 
val mutableListIterator = numbers.listIterator()mutableListIterator.next()
mutableListIterator.add("two")
mutableListIterator.next()
mutableListIterator.set("three")println(numbers)
// [one, two, three, four]

1.5 集合Range

使用rangeTo()可以创建范围,rangeTo()对应的操作符:…。

// 遍历范围
for (i in 1..4) print(i)// 反序遍历:
for (i in 4 downTo 1) print(i)// 反序遍历2:
for (i in (1..4).reversed()) print(i)// 定义步长:
for (i in 1..8 step 2) print(i)// 不包含末尾元素:
for (i in 1 until 10) print(i)

1.6 集合序列 Sequence

序列和迭代器的差别
Iterable遍历执行多步操作时,会先对所有元素执行一个步骤,将结果保存到中间集合中,然后再对中间集合中所有元素执行下一个步骤,以此类推。相当于,所有元素被并行处理。

Sequence遍历执行多步操作时,会对一个元素执行所有步骤,然后再对下一个元素执行所有步骤,以此类推。相当于,所有元素被串行处理。

// 1.通过元素创建
val s1 = sequenceOf(1, 2, 3)// 2.通过Iterable创建
val list = listOf(1,2,3)
val s2 = list.asSequence()// 3.通过generateSequence()函数创建// 4.通过sequence()创建// 例子:假设有很多单词,我们要过滤长度超过3个字母的单词,然后打印前4个这种单词的长度。
// Iterable的方式
val words = "The quick brown fox jumps over the lazy dog".split(" ")
val lengthsList = words.filter { println("filter: $it"); it.length > 3 }.map { println("length: ${it.length}"); it.length }.take(4)
println("Lengths of first 4 words longer than 3 chars:")
println(lengthsList)// Sequence的方式
val words = "The quick brown fox jumps over the lazy dog".split(" ")
// 将 List 转换为序列
val wordsSequence = words.asSequence()
val lengthsSequence = wordsSequence.filter { println("filter: $it"); it.length > 3 }.map { println("length: ${it.length}"); it.length }.take(4)
println("Lengths of first 4 words longer than 3 chars")
// 终止操作: 以 List 形式获取结果
println(lengthsSequence.toList())
  1. filter()map()take()这些操作,在调用toList()后才开始执行。与上面Iterable相比,是”lazy“的。
  2. 当结果元素数量到达4个时,会停止处理,因为take(4)指定了最大元素数量。与上面Iterable相比,节省了操作步骤。
  3. Sequence处理执行了 18 步,而使用Iterable时则需要 23 步。

1.7 常用的集合函数式API

1.7.1 map()函数

它用于将每个元素都映射成一个另外的值,映射规则在Lambda表达式中指定,最终生成一个新的集合,

val list1 = listOf("aa", "bb") 
var newList = list1.map{ it.toUpperCase()}
for (content in list1){content.toUpperCase() //转换成大写模式
}

1.7.2 filter()函数

用于过滤集合中的数据,可以单独使用,也可以和map()一起使用

val list1 = listOf("aa", "bbbb", "cc") 
var list2 = list1.filter { it.length <= 2 }.map { it.toUpperCase() }

1.7.3 any()函数

判断集合中是否至少存在一个元素满足指定条件

val list1 = listOf("aa", "bbbb", "cc") 
var anyResult = list1.any { it.length <= 2 }

1.7.4 all()函数

判断集合中是否所有元素都满足指定条件

val list1 = listOf("aa", "bbbb", "cc") 
var allResult = list1.all { it.length <= 2 }

1.7.5 maxBy()函数

定义一个集合,然后找出里面长度最长的元素,maxBy的工作原理是根据传入的条件来进行遍历,从而找打最大值

val list1 = listOf("aa", "bbbb", "cc") 
var maxLength = list1.maxBy { it.length }
print(maxLength)

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

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

相关文章

风光十几年的MIUI要无了,小米自研MIOS即将就位

今年8月小米新品发布会上&#xff0c;K60 至尊版亮相的同时带来了下一代系统&#xff08;或者说UI &#xff09;的名字&#xff1a;MIUI 15 。 好家伙不知不觉已经要更到 15 了&#xff0c;大家用过几个版本呢&#xff1f; 回想起 MIUI V1 内测发布、MIUI V5 全民刷机、MIUI 8…

skywalking动态配置[集成nacos/apollo/consul]

说明:以下配置仅关于的阈值规则的动态配置,其他参数也可以进行配置。 1,skywalking动态配置集成nacos 编辑application.yml nacos配置参数如下: nacos:# Nacos Server HostserverAddr: 10.10.5.145# Nacos Server Portport: 8848# Nacos Configuration Groupgroup: skywal…

【数据结构】二叉树--链式结构的实现 (遍历)

目录 一 二叉树的遍历 1 构建一个二叉树 2 前序遍历 3 中序遍历 4 后续遍历 5 层序 6 二叉树销毁 二 应用(递归思想) 1 二叉树节点个数 2 叶子节点个数 3 第K层的节点个数 4 二叉树查找值为x的节点 5 判断是否是二叉树 一 二叉树的遍历 学习二叉树结构&#xff0…

TOGAF(企业架构)

TOGAF 核心概念&#xff08;官方原版&#xff09; 什么是TOGAF&#xff1f; TOGAF?是一种经验证的企业架构方法和框架&#xff0c;被世界领先的组织用于提高业务效率。它是一个企业架构标准&#xff0c;确保企业架构专业人员之间的标准、方法和通信一致&#xff0c;以便我们…

sqli-lab靶场通关

文章目录 less-1less-2less-3less-4less-5less-6less-7less-8less-9less-10 less-1 1、提示输入参数id&#xff0c;且值为数字&#xff1b; 2、判断是否存在注入点 id1报错&#xff0c;说明存在 SQL注入漏洞。 3、判断字符型还是数字型 id1 and 11 --id1 and 12 --id1&quo…

can not remove .unionfs

文件夹下出现unionfs 套娃&#xff0c;无法删除。 处理方式&#xff1a; 需要管理员权限umount之后删除使用fusermount -zu .unionfs &#xff0c;然后再删除。

java - 设计模式 - 状态模式

文章目录 前言java - 设计模式 - 状态模式1. 概述2. 作用3. 示例 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xf…

java处理时间-去除节假日以及双休日

文章目录 一、建表:activity_holiday_info二、java代码1、ActivitityHolidayController.java2、ActivityHolidayInfoService.java3、ActivityHolidayInfoServiceImpl.java 三、测试效果 有些场景需要计算数据非工作日的情况&#xff0c;eg&#xff1a;统计每个人每月工作日签到…

深度学习之微调

在现代深度学习领域&#xff0c;精细调整&#xff08;Fine-tune&#xff09;已经成为一种非常重要的技术手段。 预训练模型 在介绍finetune之前&#xff0c;先了解一下什么是预训练模型。在搭建一个网络模型来完成一个特定的图像分类的任务时&#xff0c;首先&#xff0c;需要…

tortoise创建本地仓库

1.安装git和tortoise 推荐 TortoiseGit的安装与配置方法 以及 Git TortoiseGit 配置步骤以及本地版本管理 这里记录一下我遇到的问题 1.右键没有创建本地版本库 2 .创建了但是克隆不了 后续专有 一般选专有网络 注意自行谨慎选择 自行负责

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— JS进阶(四)完结撒花✿✿ヽ(°▽°)ノ✿

思维导图 高阶技巧 1. 深浅拷贝 1.1 浅拷贝 1.2 深拷贝 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewpor…

Vue2实现图片预览功能 -- v-viewer:图片查看器

一. 先看效果图 二. 具体步骤 简介&#xff1a;一款基于 viewer.js 封装的Vue版插件&#xff0c;可用于图像查看&#xff0c;以及图片的旋转、缩放等功能预览 官网&#xff1a;v-viewer 文档说明&#xff1a;Vue图片浏览组件v-viewer&#xff0c;支持旋转、缩放、翻转等操作 - …

C++学习——“面向对象编程”的涵义

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 类是一个通用的概念&#xff0c;C、Java、C#、PHP 等很多编程语言中都支持类&#xff0c;都可以通过类创建对象。我们可以将类看做是结构体的升级版&#xff0c;C语言的晚辈们看到了C…

LeetCode2562

public static long jointArrayData(int[] nums) {//定义变量存放数据long num 0;//头尾“相加”for (int i 0,j nums.length-1; i < j; i,j--) {if (i!j){//String.valueOf先将Int转String&#xff0c;进行字符串的连接&#xff0c;再用Integer.parseInt方法转回IntStri…

Linux编译FFmpeg

Linux编译FFmpeg 1. 下载FFmpeg源码 FFmpeg源码下载地址&#xff1a;http://ffmpeg.org/download.html 在下面选择版本 2. 解压并创建生成目录 tar xvf ffmpeg-snapshot.tar.bz2 // 解压下载的FFmpeg源码 makedir /root/ffmpeg // 创建生成目录3. 编译FFmpeg 进入FF…

初识Java 13-3 异常

目录 try-with-resources语句 一些细节 新特性&#xff1a;try-with-resources中的实际变量 异常匹配 其他可选方式 检查型异常的一些观点 链式异常的使用 异常的使用指南 小结 本笔记参考自&#xff1a; 《On Java 中文版》 try-with-resources语句 层层叠叠的异常很…

高考600分能上哪些大学 分数线在600以下的大学

大部分学生在高考时最关注一定就是自己的分数最终可以考上哪些大学了&#xff0c;其中600是很多人最关注的一个分数线&#xff0c;那么高于600分的话可以上哪些大学呢&#xff1f;下面就来告诉大家吧。 高考600分能上的大学&#xff1a;湖南大学、西南大学、西安电子科技大学、…

一文理清JVM结构

JVM结构介绍 JVM一共分为三个组成部分: 1 类加载子系统 主要是将class文件加载到内存中的一个系统&#xff0c;其核心组件是类加载器 2 运行时数据区子系统 1 JVM私有部分 1 虚拟机栈 描述的是Java方法执行的内存模型&#xff1a;每个方法在执行的同时都会创建一个栈帧&…

Android绑定式服务

Github:https://github.com/MADMAX110/Odometer 启动式服务对于后台操作很合适&#xff0c;不过需要一个更有交互性的服务。 接下来构建这样一个应用&#xff1a; 1、创建一个绑定式服务的基本版本&#xff0c;名为OdometerService 我们要为它增加一个方法getDistance()&#x…

linux下安装ffmpeg的详细教程、ffmpeg is not installed

1、下载解压 wget http://www.ffmpeg.org/releases/ffmpeg-6.0.tar.gz tar -zxvf ffmpeg-6.0.tar.gz 2、 进入解压后目录,输入如下命令/usr/local/ffmpeg为自己指定的安装目录 cd ffmpeg-6.0 ./configure --prefix/usr/local/ffmpeg make sudo make install 3、配置变量 v…