Kotlin中的集合函数
本文会介绍一些 Kotlin 集合函数,这些函数可以极大地提高我们的开发效率,可以作为小抄随时翻阅~
删除array中重复的字符串
有很多方式可以从数组里移除重复的字符串:
// 保留元素的原始顺序
val devs = arrayOf("Amit", "Ali", "Amit", "Sumit", "Sumit", "Himanshu")
print(devs.distinct()) // [Amit, Ali, Sumit, Himanshu]
// 保留元素的原始顺序
val devs = arrayOf("Amit", "Ali", "Amit", "Sumit", "Sumit", "Himanshu")
print(devs.toSet()) // [Amit, Ali, Sumit, Himanshu]
// 保留元素的原始顺序
val devs = arrayOf("Amit", "Ali", "Amit", "Sumit", "Sumit", "Himanshu")
print(devs.toMutableSet()) // [Amit, Ali, Sumit, Himanshu]
// 不保留元素的原始顺序
val devs = arrayOf("Amit", "Ali", "Amit", "Sumit", "Sumit", "Himanshu")
print(devs.toHashSet()) // [Amit, Ali, Sumit, Himanshu]
**将array 转为 list 或者 string **
你可以使用joinToString
函数将 list 转为字符串。例如, 有一个城市列表(Delhi, Mumbai, Bangalore),,然后你可以把列表转为这样的字符串: “India is one the best country for tourism. You can visit Delhi, Mumbai, Bangalore, etc, and enjoy your holidays”.
val someKotlinCollectionFunctions = listOf("distinct", "map","isEmpty", "contains","filter", "first","last", "reduce","single", "joinToString"
)
val message = someKotlinCollectionFunctions.joinToString(separator = ", ",prefix = "Kotlin has many collection functions like: ",postfix = "and they are awesome.",limit = 3,truncated = "etc "
)
print(message)
Kotlin 还有很多很棒的函数,比如 distinct, map, isEmpty, 等等
把一个集合转为单个结果
如果你想把一个给定的集合转换为单个结果,可以使用 rudece
函数。例如你可以对列表里所有元素求和:
val numList = listOf(1, 2, 3, 4, 5)
val result = numList.reduce { result, item ->result + item
}
print(result) // 15
// 注意:如果列表是空的,会抛出RuntimeException
判断所有元素是否满足特定条件
如果你有一个数组或者列表,你想了解其中的所有元素是否全部满足某个条件,可以使用all
函数:
data class User(val id: Int, val name: String, val isCricketLover: Boolean, val isFootballLover: Boolean)
val user1 = User(id = 1, name = "Amit", isCricketLover = true, isFootballLover = true)
val user2 = User(id = 2, name = "Ali", isCricketLover = true, isFootballLover = true)
val user3 = User(id = 3, name = "Sumit", isCricketLover = true, isFootballLover = false)
val user4 = User(id = 4, name = "Himanshu", isCricketLover = true, isFootballLover = false)
val users = arrayOf(user1, user2, user3, user4)
val allLoveCricket = users.all { it.isCricketLover }
print(allLoveCricket) // true
val allLoveFootball = users.all { it.isFootballLover }
print(allLoveFootball) // false
找到一个能够满足给定条件的元素
你可以使用find
函数在列表里找到一个满足给定条件的元素。比如,在一个学生列表中找到id是5的学生。find
函数会返回匹配给定条件的第一个元素,如果没有找到,会返回 null
。
single
函数会返回匹配给定条件的唯一元素,如果有多个元素满足条件或者没有满足条件的元素,会抛出异常:
data class User(val id: Int, val name: String)
val users = arrayOf(User(1, "Amit"),User(2, "Ali"),User(3, "Sumit"),User(4, "Himanshu")
)
val userWithId3 = users.single { it.id == 3 }
print(userWithId3) // User(id=3, name=Sumit)
val userWithId1 = users.find { it.id == 1 }
print(userWithId1) // User(id=1, name=Amit)
将列表拆分成多个更小的列表
当你有一个较大的列表,想把它拆分成多个子列表,然后对这些子列表执行一些操作。这时,可以使用chunked函数
:
val numList = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val chunkedLists = numList.chunked(3)
print(chunkedLists) // [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
复制数组
你可以使用这些函数实现对已有数组的复制:
- copyInto: 这个函数会把自己数组的指定范围的元素复制到另一个数组的指定位置中,如果目标数组下标越界,会抛出数组下标越界异常:
val arrayOne = arrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val arrayTwo = arrayOf(11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
arrayOne.copyInto(destination = arrayTwo, destinationOffset = 2, startIndex = 0, endIndex = 4)
arrayTwo.forEach {print("$it ")} // 11 12 1 2 3 4 17 18 19 20
类似地,还有其他的函数可以实现数组元素的复制,例如:
- copyOfRange(fromIndex, toIndex): 返回一个复制了原数组指定范围元素的新数组
- copyOf() or copyOf(newSize): 返回一个复制了原数组的长度为 newSize 的新数组,如果没有指定newSize,默认复制整个数组。
改变集合的类型
你可以视情况改变集合的类型。 你可以通过引用旧集合来新建一个其他类型的集合:
toIntArray, toBooleanArray, toLongArray, toShortArray, toByteArray, toDoubleArray, toList, toMap, toSet, toPair, 等函数可以改变集合的类型etc can be used to change the type of one collection to another type.
var uIntArray = UIntArray(5) { 1U }
var intArray = uIntArray.toIntArray()
intArray[0] = 0
print(uIntArray.toList()) // [1, 1, 1, 1, 1]
print(intArray.toList()) // [0, 1, 1, 1, 1]
这里我们创建了新集合并改变了新集合中的元素,这不会影响就集合。同时,我们也可以持有旧集合的引用来改变集合类型,改变一个集合就会影响到另外的那个集合。像这以as
前缀的函数:asIntArray, asLongArray, asShortArray, asByteArray, asList等等:
var uIntArray = UIntArray(5) { 1U }
var intArray = uIntArray.asIntArray()
intArray[0] = 0
print(uIntArray.toList()) // [0, 1, 1, 1, 1]
print(intArray.toList()) // [0, 1, 1, 1, 1]
将key与数据关联
如果你有一个列表数据,想把数据和数据中的key关联起来,可以使用associateBy
函数:
data class Contact(val name: String, val phoneNumber: String)
val contactList = listOf(Contact("Amit", "+9199XXXX1111"),Contact("Ali", "+9199XXXX2222"),Contact("Himanshu", "+9199XXXX3333"),Contact("Sumit", "+9199XXXX4444")
)
val phoneNumberToContactMap = contactList.associateBy { it.phoneNumber }
print(phoneNumberToContactMap)
// Map with key: phoneNumber and value: Contact
// {// +9199XXXX1111=Contact(name=Amit, phoneNumber=+9199XXXX1111),
// +9199XXXX2222=Contact(name=Ali, phoneNumber=+9199XXXX2222),
// +9199XXXX3333=Contact(name=Himanshu, phoneNumber=+9199XXXX3333),
// +9199XXXX4444=Contact(name=Sumit, phoneNumber=+9199XXXX4444)
// }
在上面的例子里,key 是 phoneNumber ,value 是 Contact。如果你不想将整个Contact 作为value,那么可以像这样传你期望的值:
val phoneNumberToContactMap = contactList.associateBy({it.phoneNumber}, {it.name})
print(phoneNumberToContactMap)
// Map with key: phoneNumber and value: name
// {// +9199XXXX1111=Amit,
// +9199XXXX2222=Ali,
// +9199XXXX3333=Himanshu,
// +9199XXXX4444=Sumit}
// }
找到集合中唯一的元素
我们可以调用 distinct
函数来获得列表中的唯一的元素集合
val list = listOf(1, 2, 2, 3, 3, 3, 4, 4, 4, 4)
println(list.distinct()) // [1, 2, 3, 4]
联合集合
调用 union
函数可以获得两个集合中的唯一元素,元素在原集合中的顺序也会保留,第二个集合的元素会添加到第一个集合的元素后面
val listOne = listOf(1, 2, 3, 3, 4, 5, 6)
val listTwo = listOf(2, 2, 4, 5, 6, 7, 8)
println(listOne.union(listTwo)) // [1, 2, 3, 4, 5, 6, 7, 8]
取集合的交集
为了得到两个集合中共有的元素,可以使用intersect
函数,它会返回在两个集合中都出现的公共元素集合
val listOne = listOf(1, 2, 3, 3, 4, 5, 6)
val listTwo = listOf(2, 2, 4, 5, 6, 7, 8)
println(listOne.intersect(listTwo)) // [2, 4, 5, 6]
只保留特定元素
使用retainAll
函数保留特定元素,该函数会修改原列表,所以确认列表或数组可被修改
如果有元素被从列表中删除了,retainAll
会返回true,否则会返回false
val listOne = mutableListOf(1, 2, 3, 3, 4, 5, 6)
val listTwo = listOf(1, 2, 3, 3, 4, 5, 6)
val listThree = listOf(1, 2, 3, 3, 4, 5, 7)
println(listOne.retainAll(listTwo)) // false
println(listOne.retainAll(listThree)) // true
println(listOne) // [1, 2, 3, 3, 4, 5]
类似地,使用removeAll
函数可以删除集合中的在另一集合中出现的元素。
基于条件过滤集合
filter
函数可以过滤掉集合中不满足指定条件的元素,它会返回一个满足该条件的所有元素的列表:
val list = listOf(1, 2, 3, 4, 5, 6, 7, 8)
val filteredList = list.filter { it % 2 == 0 }
print(filteredList) // [2, 4, 6, 8]
filterIndexed
可以基于下标过滤元素。如果想把过滤后的元素保存在某个集合中,那么,用filterIndexedTo
函数吧:
val list = listOf(1, 2, 3, 4, 5, 6, 7, 8)
val filteredList = mutableListOf<Int>()
list.filterIndexedTo(filteredList) { index, i -> list[index] % 2 == 0 }
print(filteredList) // [2, 4, 6, 8]
你可以使用filterIsInstance
函数过滤出满足特定类型实例的元素:
val mixedList = listOf(1, 2, 3, "one", "two", 4, "three", "four", 5, 6, "five", 7)
val strList = mixedList.filterIsInstance<String>()
print(strList) // [one, two, three, four, five]
压缩集合
zip
函数返回一个二元组列表,二元组的第一个元素取自第一个集合,第二个元素曲子第二个集合。返回的列表长度等于两个集合中较短的集合的长度:
val listOne = listOf(1, 2, 3, 4, 5)
val listTwo = listOf("a", "b", "c", "d", "e", "f")
print(listOne zip listTwo) // [(1, a), (2, b), (3, c), (4, d), (5, e)]
zipWithNext
函数返回的二元组列表,二元组的元素是集合中相邻元素构成的:
val list = listOf(1, 2, 3, 4, 5)
print(list.zipWithNext()) // [(1, 2), (2, 3), (3, 4), (4, 5)]
解压缩集合
unzup
函数返回一个列表二元组,元组中第一个列表由原集合中二元组的第一个元素组成,第二个元素由原集合二元组中第二个元组组成:
val list = listOf("Amit" to 8, "Ali" to 10, "Sumit" to 4, "Himanshu" to 2)
val (players, footballSkills) = list.unzip()
print(players) // [Amit, Ali, Sumit, Himanshu]
print(footballSkills) // [8, 10, 4, 2]
将数组分成两部分
如果你想通过某些条件将一个数组分为两份,partition
函数可以满足要求:
data class User(val id: Int, val name: String, val isFootballLover: Boolean)
val users = listOf(User(1, "Amit", true),User(2, "Ali", true),User(3, "Sumit", false),User(4, "Himanshu", false)
)val (footballLovers, nonFootballLovers) = users.partition { it.isFootballLover }print(footballLovers) // [User(id=1, name=Amit, isFootballLover=true), User(id=2, name=Ali, isFootballLover=true)]print(nonFootballLovers) // [User(id=3, name=Sumit, isFootballLover=false), User(id=4, name=Himanshu, isFootballLover=false)]
反转列表
reversed
函数和 asReversed
函数可以把列表反转。不同之处在于:reversed
可以应用在Array
, List
, and MutableList
上,函数返回一个反转后的新列表; asReversed
可以用于List
, and MutableList
上,函数返回的列表仍然引用旧列表,改变其中一个,会影响另一个列表:
val list = listOf(1, 2, 3, 4, 5)
print(list.reversed()) // [5, 4, 3, 2, 1]
print(list.asReversed()) // [5, 4, 3, 2, 1]
类似地,还有 reversedArray
,reverse
两个函数。
将集合元素分组
groupBy
函数可以把集合元素基于某个条件分组:
val list = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
print(list.groupBy { it % 4 })
// {// 1=[1, 5, 9],
// 2=[2, 6, 10],
// 3=[3, 7],
// 0=[4, 8]
// }
对集合元素排序
sorted
函数可以将集合元素排序,并返回一个排序后的列表:
val list = listOf(10, 4, 1, 3, 7, 2, 6)
print(list.sorted()) // [1, 2, 3, 4, 6, 7, 10]
除此之外,还有很多排序函数,如:sortedArray
, sortedArrayWith
, sortedBy
, sortedByDescending
, sortedArraydescending
, sortedWith
等等。
Kotlin中的集合函数相关推荐
- Kotlin中常用集合的使用
集合在程序中的比例的很重的,Kotlin针对集合进行了更加简洁和有效的封装,这边文章就简单的介绍一下list,map,set这三个最常用集合的使用. 首先在Kotlin中,明确区分了集合的只读和可变. ...
- 在Kotlin中 使用js 函数
在Kotlin中 使用js 函数 import javax.script.Invocable import javax.script.ScriptEngineManagerfun main(args: ...
- Kotlin 集合函数锦集,写给正在求职的Android开发
//将列表分解为多个较小大小的子列表 fun breakListMultiple(){ val numList = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) val ...
- 什么?有人整理了Kotlin 集合函数锦集!!
自从Kotlin官宣为Android开发首选语言后,大家也都正计划很快转向Kotlin或者已经完全转向Kotlin,接下来我们直奔主题了. 我们在Android应用程序中研发过程中,对于 lists, ...
- Kotlin 集合函数锦集
自从Kotlin官宣为Android开发首选语言后,大家也都正计划很快转向Kotlin或者已经完全转向Kotlin,接下来我们直奔主题了. 我们在Android应用程序中研发过程中,对于 lists, ...
- Kotlin学习笔记(三):Kotlin中的函数
一.函数的特性语法 函数的几种声明形式 //普通声明形式fun sayHello(str: String){print(str)}//允许参数有默认值,可用于方法重载fun printName(str ...
- 教你如何完全解析Kotlin中的类型系统
简述: 已经很久没有更新文章,这大概是2019年第二篇文章了,有很多小伙伴们都在公众号留言说是不是断更了.是不是跑路了.在这里统一回复下我还好,并没有跑路哈,只是在思考接下来文章主要方向在哪? 如何在 ...
- Kotlin系列之集合和函数式API完全解析-上篇
简述: 今天带来的是Kotlin浅谈系列的第八讲,这讲我们一起来聊聊Kotlin这门语言对函数式编程的支持.我们都知道在kotlin这门语言中函数荣升成为了一等公民,所以在支持函数式编程的方面,Kot ...
- Kotlin 第三讲——集合篇1
内容简介:前文介绍了数据类型相关的文章,本讲我们来聊聊 Kotlin 中的集合. 简介 Kotlin 完全兼容 Java 的集合,且 Kotlin 有专有的集合:可变集合&不可变集合(本质还是 ...
最新文章
- 带动画效果的卷积神经网络的讲解.pptx
- python 调用数据挖掘_Python数据挖掘 环境搭建
- 毕业设计记录(三)mysql的SQL语句
- Intelij IDEA 2016.3安装mybatis插件并激活教程
- RabbitMQ之交换机的四种类型和属性
- Retrofit+RxJava
- cacti 整合nagios,以及总是off处理办法!
- 【11_83】Remove Duplicates from Sorted List
- 1岁确诊脑瘫,“轮椅博士”,毕业了!
- 大规模知识图谱预训练模型及电商应用
- 用dsp的c54x汇编语言编写4位数的按位输出和计算,DSP实验三实验四(精).doc
- 【渝粤教育】电大中专电商运营实操 (13)作业 题库
- css - 布局 - rem布局
- C语言关键字之static
- 腾讯云短信服务详细教程
- WEB学习——JavaScript
- IoT嵌入式硬件--DC/DC
- css —— 文字添加白色描边
- LOG高斯-拉普拉斯算子
- 2020-06-29
热门文章
- 零基础JavaScript学习【完结篇】
- Acer 掠夺者刀锋500SE 2022 评测
- 如何让exe自己删除自己??
- 单分散PEG之Amino-PEG24-acid;CAS:196936-04-6氨基-二十四聚乙二醇-羧酸
- js-replace替换所有字符
- SingleTask启动模式,Intent跳转获取不到Bundle携带的值
- qt:无法启动进程“make“ -f //Makefile qmake_all
- ExcelVBA笔记(一):录制宏
- iQOOU1x和iQOOU3x的区别 iQOOU1x和iQOOU3x参数对比
- 我和玩拍网:灿烂星光