上一期我们讲了内置函数的使用,其重点就在于内置函数的it和this,哪一些具有this,哪一些具有it,还有就是返回值,是对象本身还是最后一行;我们在对计算机上的文件进行操作试,可能会一直通过一个对象来点出函数调用,这样的话很繁琐,而这些内置函数的一个链式调用就很好的解决了这个问题,因为都是有返回值的,而且返回的还是对象本身,比如apply函数;
那么这一期就开始我们会常用的的数据存储这一块,集合和数组,我们就做一个简单介绍然后代码演示,虽然语言简单,但是代码都是很清晰的,大家会用就可以,毕竟学过一门编程语言之后,这些差不多用到的东西还是很好理解的,集合和数组都是用来存放一些数据的,在我们的Android开发过程中会大量用到,所以大家务必要理解这一期的内容:
1、创建:
含有两种类型,一种是不可变类型,一种是可变类型,可变类型具有add和remove的操作,但是这两者可以相互转化,不管是什么变量,kotlin始终是将类型放在变量名的后面,而且强大的类型推断可以简化很多代码:
- /*
- * list的学习:
- * list含有两种,一种是不可变的(list),一种是可变的(mutablelist)
- * 可变的list具有add和remove操作;遍历它们含有三种常用的方式:增强for,
- * foreach,foreachindexed
- * */
- //1.1 创建list
- //不可变的list
- val list1: List<String> = listOf<String>("孙悟空","猪八戒","沙和尚")
-
- //可变的,注意后面的mutable首字母小写
- val list2: MutableList<String> = mutableListOf<String>("孙悟空","猪八戒","沙和尚")
- //1.2 简化写法
- /*
- 因为kotlin的类型推导,我们完全可以使用简化写法来节省代码
- val list1 = listOf("孙悟空","猪八戒","沙和尚")
- val list2 = mutableListOf("孙悟空","猪八戒","沙和尚")*/
- //1.3 可以变和不可变之间还可以互相转化
- //不可变转可变
- val list3 = list1.toMutableList()
- //可变转不可变
- val list4 = list2.toList()
可变和不可变就是是否可以对集合进行修改,这里表示的数据添加与删除;
2、数据的添加和移除:
- //2.1 可变集合的增删操作
- //添加,第二种独特的添加方式本质上是运算符重载
- list2.add("唐僧")
- list3 += "唐僧"
- //删除
- list2.remove("猪八戒")
- list3 -= "猪八戒"
这是kotlin的独特之处,是将很多种语言的优势集于一身的语言;可以通过运算符重载的当时来直接使用运算符在对元素进行操作,使用加减等于进行数据的修改 其实效果和add、remove是一样的;
3、集合的遍历:
含有三种常用的遍历方式,kotlin大量使用匿名函数:
- //2.2 集合的遍历
- //增强for
- println("增强for遍历:")
- for (s in list1) {
- print("$s ")
- }
- //foreach,主要就是使用it代表每一个元素
- println("foreach遍历:")
- list1.forEach{
- print("$it ")
- }
- //foreachindexed带有下标的遍历
- println("foreachindexed带有下标的遍历")
- /*
- * 因为含有两个参数,前面是下标,后面数数据,
- * 所以我们不能使用it了
- * */
- list1.forEachIndexed{
- index,item ->
- print("下标:${index} 元素:${item} ")
- }
直接使用匿名函数遍历,因为匿名函数在kotlin里面非常简洁,而且还方便好用;
4、集合的解构和过滤:
有时候我们先要一次性拿到所有集合中的元素,而有时候有些元素我们又不想要,就需要使用到我们的解构和过滤了:
- //2.3 解构和过滤集合
- //解构,直接用括号传结合表示解构
- val (v1,v2,v3) = list1
- //过滤:使用下划线来过滤掉不需要的数据
- val (_,v4,v5) = list1
- println("v1:${v1} v2:${v2} v3:${v3}")
- println("v4:${v4} v5:${v5} ")
1、创建
与list一样具有可变和不可变性,当然简便写法也有,我就不演示了:
- //2.4 set集合
- /*
- * set集合的创建和遍历使用都差不多,只是set集合可以做到去重操作
- * 就是同一个元素只会出现一次,后面的会覆盖前面的;利用这个特性,
- * kotlin的list可以依靠set来去重,因为它们可以互相转化
- * */
- //创建:同样含有可变和不可变
- //不可变
- val set1: Set<String> = setOf<String>("Tony","hello","Tony")
- println("set1: $set1")
- //可变
- val set2: MutableSet<String> = mutableSetOf<String>("Tony","hello","Tony")
-
2、获取元素
set是不具有[]方式获取的,建议使用下面两种方式获取不会出现越界的错误
- /* 不过set不具有[]的方式获取数据,而是通过elementat()获取
- * 其实这个和list的[]差不多,直接获取有时候是会出现数组越界访问
- * 的,set有和list差不多的防止越界访问的机制
- * */
- val str1 = set1.elementAt(0)
- println(str1)
-
- val str2 = set1.elementAtOrElse(10){"你越界了"}
- val str3 = set1.elementAtOrNull(1)?: {"你越界了"}
- println(str2)
- println(str3)
3、对于可变集合的添加和删除元素:
- //可变的具有add和remove操作
- set2.add("唐僧")
- set2.remove("hello")
- println(set2)
4、对于灵活性,就是可以list和set相互转化,达到一个去重的效果:
- //2.5 list 和set 的相互转化
- val set3 = list1.toSet()
- //如果我们需要给list去重的话,就是这样
- list1 = list1.toSet().toList()
- //这样写太繁琐,其实还有简便写法:
- list1 = list1.distinct()
- println(list1)
array数组常用在一些基本的数据类型当中,而且list也可以在一些char、对象和数字类型转换为数组:
- //2.6 array数组
- /*
- * 常见的有字符串数组、整型数组、浮点、char、对象数组
- * 其实list是可以转数组的,一般的基本数据类型都有数组
- * */
- //创建:直接写简化写法,类型推断,和集合是一样的
- val array1 = arrayOf(1,2,3,4,5)
- //获取元素:和set一样,不过通过elementatorelse获取的时候提示一定是整型
- val arrayvalue1 = array1.elementAtOrElse(1){-1}
- val arrayvalue2 = array1.elementAtOrNull(10)?: "越界了"
- println(arrayvalue1)
- println(arrayvalue2)
- //list 转数组,只支持char、对象和数字类型
- val array2 = listOf<Char>('a','b').toCharArray()
- println(array2)
数组的结果是没有中括号的;查找元素的话就和集合差不多,就是在使用elementAtOrElse的时候,后面返回的只能是整型数值;其他是一样的,不支持修改;
不管是哪一种数据结构,重点就是学习他的创建,获取元素和遍历,三种遍历方式,一般的,创建集合具有可变集合和不可变集合,而且他们灵活到可以互相转换,使用set去重等,内容不多却很重要,大家要多多练习