转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/87781732
本文出自【赵彦军的博客】


Kotlin初体验一:集合

  • 集合
  • 一、listOf()函数
  • 二、mutableListOf()函数
  • 三、arrayListOf()函数
  • 四、listOfNotNull()函数
  • 五、binarySearch()函数

集合

List是有顺序的数据结构,在Kotlin中提供了类似数组的访问方式:

创建集合

//创建一个空的list集合,相当于 new ArrayList()
var list = mutableListOf<String>()//创建一个有初始值的list集合,相当于 CollectionsKt.mutableListOf(new String[]{"a", "b", "c"})
var list = mutableListOf("a","b","c")//获取值
//方式一:获取第1个数据,相当于 list.get(0)
var data = list[0]//方式二:
var data = list.get(0)//添加值
list.add("d")
list.add(1,"e")

其他的集合操作也类似

//创建一个空的map集合,相当于 new LinkedHashMap()
var map = mutableMapOf<String,String>()//创建一个空的set集合,相当于 new LinkedHashSet()
var set = mutableSetOf<String>()

一、listOf()函数

Collection.kt定义了三个参数不同的listOf()函数,可以方便地创建一个不可变的List:

fun <T> listOf(): List<T>
fun <T> listOf(T): List<T>
fun <T> listOf(vararg T): List<T>
  • 第一个无参的listOf()函数返回空的List,它直接调用同一文件内定义的emptyList()函数,该函数返回一个单例对象EmptyList。EmptyList是List接口的实现类,可以代表所有类型的空列表。
  • 第二个listOf()函数产生一个只有一个元素的不可变列表,它直接调用java.util.Collections类的singletonList()方法。
  • 第三个lisOf(),接受可变数量的T类型元素并生成包含这些元素的列表。传入一个T类型的数组,如果长度为0就返回空列表,否则 就将数组转换为列表。

二、mutableListOf()函数

listOf()函数可以创建不变的List,要想创建可变的List,可以使用mutableList()函数:
inline fun mutableListOf(): MutableList = ArrayList()

fun mutableListOf(vararg elements: T): MutableList<T> {if(elements.size == 0) {return ArrayList()} else {return ArrayList(ArrayAsCollection(elements, isVarargs = true))}
}

inline关键字定义了内联函数,会在编译时展开到调用处,提高性能。
Kotlin的集合框架只定义了接口,具体实现类都是直接调用Java类。mutableListOf()返回一个ArrayList对象。

三、arrayListOf()函数

arrayListOf()函数用来创建可变的ArrayList,有两个参数不同的重载形式:
inline fun arrayListOf(): ArrayList = ArrayList()

fun <T> arrayListOf(vararg elements: T): ArrayList<T> {if(elements.size == 0) {return ArrayList()} else {return ArrayList(ArrayAsCollection(elements, isVarargs = true))}
}

这个函数的实现与mutableListOf()完全一样,唯一的不同在于返回的类型不同。arrayListOf()返回ArrayList,是一个Java的ArrayList类型,所以是可变的。

四、listOfNotNull()函数

以上的函数都是可以接受null作为元素的,这与Java中的List是不同的。而这个方法会把null全部剔除掉,返回包含所有非null值的List:

fun listOfNotNull(element: T?): List<T> = if(element != null) listOf(element) else emptyList()fun listOfNotNull(vararg elements: T?): List<T>= elements.filterNotNull()

这两个函数都接受可空的T?类型参数,返回剔除所有null值的List。
第二个函数调用的Array<out T?>.filterNotNull()函数,会先新建一个ArrayList,然后遍历数组内的所有元素,如果不是null就添加到ArrayList里,最后返回ArrayList。

例子

var list = mutableListOf("a", "b", null)
Log.e("zhao","list:" + list)   //输出结果:[a, b, null]var list2 = listOfNotNull("a", "b", null)
Log.e("zhao","list no null :" + list2)  //输出结果:[a, b]

五、binarySearch()函数

Collections.kt文件中提供了四个针对List的binarySearch()函数,它们可以对列表进行二分查找:

fun <T> List<T>.binarySearch(element: T, comparator: Comparator<in T>, fromIndex: Int = 0, toIndex: Int = size): Int
fun <T> List<T>.binarySearch(fromIndex: Int = 0, toIndex: Int = size, comparison: (T) -> Int): Int
fun <T: Comparable<T>> List<T?>.binarySearch(element: T?, fromIndex: Int = 0, toIndex: Int = size): Intinline fun <T, K : Comparable<K>> List<T>.binarySearchBy(key: K?, fromIndex: Int = 0, toIndex: Int = size, crossinline selector: (T) -> K?): Int = binarySearch(fromIndex, toIndex) { compareValues(selector(it), key) }
  • 函数需要提供一个Comparator比较器,与java.util.Arrays.binarySearch()相同;
  • 函数需要提供一个(T)->Int类型的函数,用来比较列表内的元素,可以视为传入一个compareTo()函数。
  • 函数提供了可空元素的二分查找。
  • 函数需要提供一个(T)-K?类型的函数和一个K?类型的值,它会在列表中用二分查找法寻找符合这个值的元素的索引。

Kotlin提供的几个binarySearch()函数用法与Java大同小异。

返回结果是Int:

  • 0:查找成功
  • -1:查找失败

小例子:

//创建一个list
var list = mutableListOf("a", "b")//方式一:从所有的元素中查找a元素,默认开始位置0,结束位置 size
var result = list.binarySearch("a")///方式二:从指定的元素中查找a元素,默认开始位置0,结束位置 size
var result = list.binarySearch("a",0,list.size)

个人微信号:zhaoyanjun125 , 欢迎关注

Kotlin实战指南一:集合相关推荐

  1. Kotlin实战指南二十:flow

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/117370700 本文出自[赵彦军的博客] 文章目录 往期精彩文章 flow 是啥 ...

  2. Kotlin实战指南十九:use 函数魔法

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/117366756 本文出自[赵彦军的博客] 文章目录 往期精彩文章 use函数 往期 ...

  3. Kotlin实战指南十八:open、internal 关键字使用

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/117365712 本文出自[赵彦军的博客] 文章目录 往期精彩文章 open关键字 ...

  4. Kotlin实战指南十七:JvmField、JvmStatic使用

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/116668666 本文出自[赵彦军的博客] 文章目录 往期精彩文章 @JvmFiel ...

  5. Kotlin实战指南十:let、apply、with、run

    转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details//94402604 本文出自[赵彦军的博客] 文章目录 let 示例1:基础用法 示 ...

  6. Kotlin实战指南八:高阶函数

    转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/87969098 本文出自[赵彦军的博客] 高阶函数 any all count n ...

  7. Kotlin实战指南六:可空类型、非可空类型

    转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/87877529 本文出自[赵彦军的博客] 可空类型.非可空类型 变量可空类型 方法 ...

  8. Kotlin实战指南三:流程控制

    转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/87855797 本文出自[赵彦军的博客] Kotlin初体验三:流程控制 if 表 ...

  9. kotlin修炼指南8—集合中的高阶函数

    点击上方蓝字关注我,知识会给你力量 Kotlin对集合操作类新增了很多快捷的高阶函数操作,各种操作符让很多开发者傻傻分不清,特别是看一些Kotlin的源码或者是协程的源码,各种眼花缭乱的操作符,让代码 ...

最新文章

  1. Hadoop生态圈-Hbase的rowKey设计原则
  2. spark应用程序转换_Spark—RDD编程常用转换算子代码实例
  3. Python+matplotlib数据可视化设置图例3个精选案例
  4. nmon安装为什么重启mysql_Centos7部署nmon监控工具
  5. 第二季-专题17-触摸屏显身手
  6. ZStack实践汇 | ZStack平台的使用心得
  7. Origin 2022b | 更新及安装 | 中英文切换
  8. 阿里云吴翰清:我对计算的理解
  9. Springboot JPA注解@Enumerated
  10. SNIFFER问题集锦
  11. 【C++刷LeetCode套路1】Array题型: 双指针Two Pointers套路
  12. Js实战之方块跟随鼠标移动
  13. 苹果公司的创始人_世界名校巡礼15——苹果公司创始人的母校加州大学伯克利分校...
  14. module ‘eli5‘ has no attribute ‘show_weights‘
  15. 520送男朋友什么礼物比较好、520给男朋友的实用性礼物
  16. Vue2.x动态组件的使用实现组件整合大屏展示
  17. GitHub 上超屌的 9 个 Vue 开源项目
  18. 美赛模板修改【超全版】
  19. 堡垒前线7月30日服务器维护,堡垒前线7月24日停服维护公告 全新功能初心岛正式上线...
  20. LINUX命令(1)-创建文件

热门文章

  1. 五十三、开始算法刷题磨练
  2. 七十五、SpringBoot 的数据缓存cache(二)
  3. Java100例题(一)
  4. 如何遍历一个JS对象中的所有属性,输出键值对--我居然犯错半个小时
  5. 复旦大学邱锡鹏教授团队:Transformer最新综述
  6. 直播 | 小爱通用理解团队负责人雷宗:小爱同学中控意图理解
  7. 招聘 | 平安人寿人工智能研发团队北京研发中心
  8. 自动机器学习(AutoML)最新综述
  9. PaperWeekly 第52期 | 更别致的词向量模型:Simpler GloVe - Part 1
  10. 浅谈如何学习深度学习(经验之谈,仅供参考)