一、创建集合
//使用如下代码可以初始化一个List集合:
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
//使用如下代码可以初始化一个Set集合:
val set = setOf("Apple", "Banana", "Orange", "Pear", "Grape")
//使用如下代码可以初始化一个Map集合:
val map = mapOf("Apple" to 1, "Banana" to 2, "Orange" to 3, "Pear" to 4, "Grape" to 5)
二、lambda表达式
Lambda就是一小段可以作为参数传递的代码。正常情况下,我们向某个函数传参时只能传入变量,而借助Lambda却允许传入一小段代码。
我们来看一下Lambda表达式的语法结构:
{参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}
首先最外层是一对大括号,如果有参数传入到Lambda表达式中的话,我们还需要声明参数列表,参数列表的结尾使用一个->符号,表示参数列表的结束以及函数体的开始,函数体中可以编写任意行代码,并且最后一行代码会自动作为Lambda表达式的返回值。
三、集合的函数式API
以最常见的map为例:
用于将集合中的每个元素都映射成一个另外的值,映射的规则在Lambda表达式中指定,最终生成一个新的集合
//list里的所有字母大写
fun main() {
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")
val newList = list.map({ fruit: String -> fruit.toUpperCase() })
for (fruit in newList) {
println(fruit)
}
}
当Lambda参数是函数的最后一个参数时,可以将Lambda表达式移到函数括号的外面。
如果Lambda参数是函数的唯一一个参数的话,还可以将函数的括号省略。
由于Kotlin拥有出色的类型推导机制,Lambda表达式中的参数列表其实在大多数情况下也不必声明参数类型。
当Lambda表达式的参数列表中只有一个参数时,也不必声明参数名,而是可以使用it关键字来代替。
因此,可以简写为:
val newList = list.map { it.toUpperCase() }
四、空指针检查
Kotlin默认所有的参数和变量都不可为空!
可为空的类型系统,就是在类名的后面加上一个问号。如:Int? ,Person?,自定义类是类名后加问号即可为空。
使用可为空的类型系统时,需要在编译时期就把所有的空指针异常都处理掉才行。
Kotlin提供了一系列的辅助工具,使开发者能够更轻松地进行判空处理。
?. 操作符表示当对象不为空时正常调用相应的方法,当对象为空时则什么都不做。比如:
if (a != null) {
a.doSomething()
}
//等价于
a?.doSomething()
val c = if (a ! = null) {
a
} else {
b
}
//等价于
val c = a ?: b
//结合使用?.操作符和let函数也可以对多次重复调用的某个变量统一进行判空处理:
fun doStudy(study: Study?) {
study?.let {
it.readBooks()
it.doHomework()
}
}
五、字符串内嵌表达式
Kotlin中字符串内嵌表达式的语法规则如下:
"hello, ${obj.name}. nice to meet you!"
当表达式中仅有一个变量的时候,还可以将两边的大括号省略:
"hello, $name. nice to meet you!"
参数可以设置默认值,设有默认值的参数在调用时可以不传,使用的是默认值。
fun printParams(num: Int, str: String = "hello") {
println("num is $num , str is $str")
}
跟着郭神学kotlin!