上一期我们讲了内置函数的使用,其重点就在于内置函数的it和this,哪一些具有this,哪一些具有it,还有就是返回值,是对象本身还是最后一行;我们在对计算机上的文件进行操作试,可能会一直通过一个对象来点出函数调用,这样的话很繁琐,而这些内置函数的一个链式调用就很好的解决了这个问题,因为都是有返回值的,而且返回的还是对象本身,比如apply函数;
那么这一期就开始我们会常用的的数据存储这一块,集合和数组,我们就做一个简单介绍然后代码演示,虽然语言简单,但是代码都是很清晰的,大家会用就可以,毕竟学过一门编程语言之后,这些差不多用到的东西还是很好理解的,集合和数组都是用来存放一些数据的,在我们的Android开发过程中会大量用到,所以大家务必要理解这一期的内容:
list集合
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} ")
set集合
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数组
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去重等,内容不多却很重要,大家要多多练习