集合
集合包括List、Set和Map,它们在Java中都是接口
List的主要实现类是ArrayList和LinkedList,Set的主要实现类是HashSet,Map的主要实现类是HashMap
fun main(){ val list=listOf<String>("a","b") for(num in list){ println(num) } }
Set集合的用法与List集合的用法基本一致,只是将创建集合的方式换成了setOf( )和mutableSetOf( )函数而已。
fun main(){ val set=setOf<String>("Apple","Orange","Peach") for (n in set){ println(n) } }
需要注意的是,Set集合底层是使用hash映射机制来存放数据的,因此集合中的元素无法保证有序,这是Set集合和List集合最大的不同。属于数据结构相关内容
Map是一种键值对形式的数据结构,因此在用法上和List、Set集合有较大的不同。
传统的Map用法是先创建一个HashMap的实例,然后将一个个键值对数据添加到Map中
下面的写法与Java的语法最为相近
fun mian(){ val map=HashMap<String,Int>() map.put("Apple",1) map.put("Orange",2) map.put("Peach",3) }
然而实际在kotlin中并不建议使用put( )和get( )方法来对Map进行添加和读取数据操作,而是更加推荐使用一种类似于数组下标的语法结构
kotlin中的写法
向Map中添加一条数据可以如下书写
map["Apple"]=1
而从Map中读取这一条数据就可以这么写
val n=map["Apple"]
也就是说,在kotlin中Map集合的写法就变成了如下形式
fun main(){ val map=HsahMap<String,Int>() map["Apple"]=1 map["Orange"]=2 map["Peach"]=3 }
而这并不是kotlin中最简便的书写方式,因为kotlin中提供了一对mapOf( )和mutableMapOf( )函数来继续简化Map的用法
fun main(){ val map=mapOf("Apple" to 1,"Orange" to 2,"Peach" to 3) for((m,n) in map){ println("m is "+m+",n is "+n) }//for-in循环 }
这里重点学习函数式API的语法结构,也就是Lambda表达式的语法结构
首先确立一个需求:找出集合中单词最长的代码
一般来说我们可以通过对length的逐个对比得到结果
fun main(){ val l=listOf<String>("asx","s","qza","amount") var maxLength = "" for (m in l){ if (m.length > maxLength.length) { maxLength = m } println("max length is "+maxLength) }
而当我们使用函数式API时,这个功能的实现就可以变得更为简便
fun main(){ val list=listOf<String>("asx","s","qza","amount") val max=list.maxByOrNull{it.length} println(max) }
Lambda是一小段可以作为参数传递的代码,kotlin中没有对代码数量进行限制,但通常不建议在Lanbda表达式中编写太长的代码,以免影响代码的可读性。
{参数名1:参数类型;参数名2:参数类型 ->函数体} //->表示参数列表的结束,即函数体的开始。
函数体中可以编写任意代码,但不建议太长。
同时最后一行代码会自动作为Lambda表达式的返回值。
多数情况下我们并不需要使用Lambda表达式完整的语法结构,而是有很多种简化的写法
首先我们按Lambda表达式的语法结构书写
fun main(){ val list= listOf("APPle","mad","internet") val lambda={m:String->m.length} val max=list.maxByOrNull(lambda) print(max) }
接着我们对这段代码进行简化
我们不需要专门定义一个lambda的变量,而是可以直接将lambda表达式传入maxByOrNull函数中,如下:
fun main(){ val list= listOf("APPle","mad","internet") val max=list.maxByOrNull({m:String->m.length}) print(max) }
同时kotlin规定,当Lambda参数是函数的最后一个参数时,可以将Lambda表达式移到函数括号的外面,因此继续简化代码如下
fun main(){ val list= listOf("APPle","mad","internet") val max=list.maxByOrNull(){m:String->m.length} print(max) }
需要注意的是,当Lambda参数是函数唯一的一个参数时,函数的括号可以省略
fun main(){ val list= listOf("APPle","mad","internet") val max=list.maxByOrNull{m:String->m.length} print(max) }
由于kotlin拥有出色的类型推导机制,实际上Lambda表达式中的参数列表在大多数的情况下是不必声明参数类型的,也就是说代码可以进一步简化
fun main(){ val list= listOf("APPle","mad","internet") val max=list.maxByOrNull{m ->m.length} print(max) }
最后,当Lambda表达式的参数列表只剩下一个参数时,也不再需要声明函数名了,而可以用it关键字来代替,于是代码最终可以简化为如下形式
fun main(){ val list= listOf("APPle","mad","internet") val max=list.maxByOrNull{it.length} print(max) }
集合中的map函数是最常用的一种函数式API,它用于将集合的每个元素都映射成一个另外的值,映射的规则在Lambda表达式中指定,最终生成一个新的集合
举个例子,这里我们希望让所有字符串都变成大写模式
fun main(){ val list= listOf("APPle","mad","internet") val newlist=list.map{it.toUpperCase()} for(m in newlist){ println(m) } }
map函数功能非常强大,这里只是简单举例
filter函数是用来过滤集合中的数据的,它可以单独使用,也可以配合map函数一起使用
举个例子,我们现在只需要保留5个字母以内的字符串,此时就可以借助filter函数功能实现
fun main(){ val list= listOf("APPle","mad","internet") val newlist=list.filter{it.length<=5} for(m in newlist){ printf(m) } }
any函数
用于判断集合中是否至少存在一个元素满足指定条件
fun main(){ val list= listOf("APPle","mad","internet") val anyResultt=list.any{it.length<=5} } //输出结果为true
all函数
用于判读集合中是否所有元素都满足指定条件
fun main(){ val list= listOf("APPle","mad","internet") val anyResult=list.all{it.length<=5} } //输出结果为false
需要注意的一点是这两种函数式API输出的值表现为布尔类型,也就是说输出结果为 true 或者 false.